Is the ST performance better or worse than the purely functional approach? It actually looks pretty good, not really any more verbose than Java to be honest.
There is a tiny cost for each mutable memory location since the garbage collector has to work around then. A single array won't even be measurable, though.
Also, there are some referentially transparent algorithms that can't be implemented via ST - like laziness.