The issue is that the tradeoffs are unclear, it's not like you pay 10% performance penalty for using a GC - it's often much worse than that, and then you have to do manual work to "tune it". Often the tuning, following production problems, is not that different than using malloc()/free() to begin with.
When using a GC you can get 1:1 performance to non-GC if you preallocate. Both don't do anything to the memory, hence they have provably the same (possible) performance.
Most applications don't require tuning and have acceptable performance for real world usage. The reason people write in GC languages is because malloc() and free() have error cases you can avoid with a GC. A GC is a well tested structure and less likely to leak memory by forgetting a free() or doing a use-after-free.
Of course we have static analysis tools for this but those aren't perfect.
There are perfectly legit reasons to use GC, one of them being not having to do malloc()/free() at the cost of some performance characteristica which can be "tuned" as you describe it.
> "When using a GC you can get 1:1 performance to non-GC if you preallocate."
That is not always true. Also, preallocation can be impossible (due to limit on heap size) if there is no way to free memory without the GC running. Of course, you're right that there are tradeoffs, the only argument here is about the magnitude of the tradeoffs - the OP shows a hidden cost of GC that is not talked about often enough.
What are the cases where the is untrue? Are they mainstream or niche? It would be a shame to caution people away from GC by default because there exist niche cases where GC performance doesn't match manual management.
Refs might be but they aren't inherent to GC, you can have Refs without GC.
I would love to see a benchmark of GC vs non-GC using the same compiler and language for an accurate comparison. Probably also GC vs non-GC naive vs non-GC optimized.
free() is O(n) in the number of dead objects, and needs to defrag unless your object sizes are very stable. A GC can just copy the minority of live objects and then reuse the whole arena.