In functional languages this is inherently more difficult, especially when features such as lazy execution (Haskell) are introduced. A functional programmer has to reason about how the compiler will translate their unordered, pure statements into imperative machine instructions and stateful memory accesses in order to know how efficiently their program is going to run.
The above is of course an oversimplification - CPUs are complicated, and do all sorts of tricks to run sequential instructions out of order or in parallel when possible. Still, I’ve yet to see a functional language that makes reasoning about program efficiency as easy as in imperative languages.
I personally love Haskell, just not for most large-scale applications. As others have mentioned, because functional concepts can make code more succinct and more obviously correct in some cases, we’re seeing adoption of these concepts in imperative languages. I think this is good, pragmatic progress toward programming language nirvana, and I hope to see it continue.