His 30% GC time does sound excessively high. I've done experiments with incredibly string-processing heavy algorithms (lots of string.Split usage, among other things), and that spent about 10% of its runtime in the GC.

However, that was on Mono, before the introduction of the sgen GC (their old GC is not generational and will stop the world for every collection). So I find it hard to believe that .Net's much better optimized generational GC would ever use 30% of the execution time, unless your code is monumentally bad.