On performance itself, you overlooked the need to flip the argument to foldRight. Looking at the type signatures should be enough to convince you that (coll foldRight zero)(f) is only equivalent to (coll.reverse foldLeft zero)(flip(f)), and I'd guess flip(f) costs significantly more than f. I'd ask you to rerun the tests.
However, at some point we should be able to inline foldRight in the caller and have flip(f) evaluated at compile-time by the optimizer - I just don't know how close we are (Miguel Garcia is the person to ask).
The rest of my answer will focus on why the bug should indeed be fixed, even if it was closed as WONTFIX. My strongest argument is that some implementations of foldRight have already been fixed, so the current situation is at best incoherent.
The main concern discussed in the ticket is not performance, but correctness. The problem is that different people disagree on the specification of foldRight. But I'd argue that at least the ScalaDocs should be fixed (so I've filed
https://issues.scala-lang.org/browse/SI-6922).
I'll quote the current status from John Connor:
> As it stands now the function is useless – using it is a bug waiting to happen.
As I understand it, one of Martin's arguments was that since
> It's obvious that foldright is not tail-recursive
there's no point in fixing it. Now, I don't know in 2010, but at least in 2013 I feel Ben Wing is right:
> In reality, although Martin may personally have a clear idea which functions are and aren't tail-recursively-safe, the average Scala programmer has little or no idea.
By current standards, this should really be documented.
Moreover, Martin argued that one would need to fix also `last`, `reduceRight` and so on. In fact, `TraversableLike.last` is currently not affected; TraversableOnce.{fold,reduce}Right, IndexedSeqOptimized.{fold,reduce}Right are already fixed by using reverse.{fold,reduce}Left, while LinearSeqOptimized.fold/reduceRight have the same bug.
Another of Martin's arguments was that the change would confuse the computational model, but he never fleshed out that argument and I don't get it. I wondered whether an impure operator f might distinguish (coll foldRight zero)(f) from (coll.reverse foldLeft zero)(flip(f)), and I think the answer is "no". Moreover, the fix is already in the library.
Last Martin's argument went on as:
> It would just confuse the computation model, and will not work for streams anyway. Furthermore, you then need to do the same thing for reduceRight, last, and so on and so on. I don't want to go there. I realize that seen in isolation every ticket seems hugely important and therefore one tends to overengineer, at the cost of overall simplicity and consistency. I have to be the guardian of those.
(But take a look at Paul Chiusano's reply, about streams among other things - I need to take another look at it: