But there are definitely projects that require explicit memory management, and it's not just games and realtime software. Often high-performance backend code in Java and Go just end up using object pools instead of reallocating objects, just as the OP described.
With Go specifically we've seen the rise of fasthttp, which just adds completely manual memory management in the 90's C++ fashion. Want to create a new request object?
req := AcquireRequest() req.DoSomething() ReleaseRequest(req)
Compare to C++98:
Request* req = new Request(); req->DoSomething(); delete req;
And now you're back at the same manual memory management problem modern C++ and Rust are striving to solve.
Similarly, high performance Java libraries like the Disruptor, SBE or Chronicle look very much like C code.
Personally, that doesn't bother me, as it allows you to write your hot path and your non-optimized path in the same language with the same tooling.
says the guy who has split JVMs across processes for performance and contemplated doing it per core
RAII of course deals with more than just memory, but in a thread about GC I assumed it was memory management you referred to.
This is not to say that no project benefits heavily form C++/Rust. But I would argue that for many, GC is the best trade off.