In my area of business - back office IT for a financial institution - it is very common for a software component to carry a global configuration around, to log its progress, to
The concept behind monad transformers is quite tricky and hard to understand, monad transformers lead to very complex type signatures
I Think this is a bit of an exaggeration:
Monad transformers are not your only options, you could write a custom Monad, use a continuation Monad. You have mutable references/arrays in IO (global), ST (local and controlled, no IO actions), MVar (synchronizing), TVar (transactional).
I've heard that the potential efficiency issues with Monad transformers could be mitigated just by adding INLINE pragmas to bind/return in the source of mtl/transformers library.