Haskell is an extremely high-level language, and you're asking a question about an extremely low-level detail.
Overall, Haskell's performance is probably similar to any garbage-collected language like Java or C#. In particular, Haskell has mutable arrays, which will have performance similar to any other array. (You may need unboxed arrays to match C performance.)
For something like a fold, if the final result is something like a machine integer, that probably ends up in a processor register for the entire duration of the loop. So the final machine code is pretty much identical to “a continuously-accessed variable in C”. (If the result is a dictionary or something, then probably not. But that's the same as C as well.)
More generally, if locallity is something that matters to you, any garbage-collected language probably isn't your friend. But, again, you can use unboxed arrays to work around that.
All of this talks is great and all, but if you really want to know how fast a specific Haskell program is, benchmark it. It turns out well-written Haskell programs are usually quite fast. (Just like most compiled languages.)
Added: You can ask GHC to output partially-compiled code in Core format, which is lower-level than Haskell but higher-level than machine code. This lets you see what the compiler has decided to do (in particular, where stuff has been inlined, where abstractions have been removed, etc.) This can help you find out what the final code looks like, without having to go all the way down to machine code.