Many do not use this approach because speed matters above all else.
Except that it doesn't have much to do with speed anymore. If you use a language like C++, you're pretty much stuck with a conservative stop-the-world garbage collector. This is unfortunate, because it can cause delays.
Oh, wait, freeing something isn't deterministic either, unless you're doing custom memory management. But wait! You can do custom memory management with many GC'd languages too.
If you're writing for speed, you avoid allocating and deallocating to the heap. That applies
whether or not you use a GC.
Now, add the wrinkle that modern GCs in higher-level languages can be incremental copying generational collectors. They give you O(1) allocation, and because they're incremental the delay is very low -- some are so fast their delay is on the order of that of a context switch.
An example of the latter is IBM's Metronome GC:
http://domino.research.ibm.com/comm/research_projects.nsf/pages/metronome.metronomegc.html