There exist some semi real time garbage collectors, but they are pretty specialized, so in the general case, it is true. Unless you're using an unorthodox definition of real time.
I've got some experience with coding realtime applications in Java, a language where you really can't escape the garbage collector, and I can say that I've thoroughly tested for garbage collection problems numerous times in diverse scenarios and saw no principal flaws whatsoever. And I'm not a genius with these under-the-hood things. I just keep my structures sane. I use OO where it makes a difference.
Don't OO-ify your vertices, polys, bezier handles and so forth. Don't do dumb stuff. All you want to do with those is have them ready, so just dump them into everlasting structures, and flush when you need to (loading…
. As long as you're aware that objects in realtime applications are supposed to fulfill grand-stroke needs, you're doing it right. If all you want to do is inherit and inherit, you're doing it wrong.
Here's a simple scenario: You have a tree of 3D meshes that inherit rotation and location upwards.
Make an object "Mesh", dump imported geometric data into native arrays, feed that to the GPU (maybe as vertex lists or VBOs), operate on OGL addresses. Do rotation and location with stacked matrices. If your data is dynamic beyond whole-mesh rotations, like with skeletal per-vertex skinning or whatever, write shaders so that the bulk of these operations is on the GPU (where you really want it).
Don't give each vertex, poly, UV segment and so forth an object. That'll break your neck when it comes to garbage collection.
You would do exactly the same with C++.
Here's a tougher scenario: Dynamically-defined changing UI defines procedurally-generated datasets (like, you can add a new textfield with the caption "Text", and when you enter text, it is displayed in 3D in the main view).
Make the UI OO through and through, but follow the IMGUI concept (look it up, it generally just makes sense in realtime scenarios). Have generic datasets as manipulation templates (in the above example, 3D letter sets make sense), keep UI-derived dynamic data in non-OO structures like arrays, operate on array fields directly in your UI event handlers via one hash table. Don't look for dynamic data in the buttons when you render; look in the array and feed array data to a shader.
Therefore, buttons may die, but the data never dies. You won't have 10M buttons, but you will have 10M data fields. You've saved garbage collection a lot of work!
Another scenario: Music playback. Like, Ogg Vorbis. With chunks to throw at OpenAL. You can't give each chunk an object. Obviously. You're gonna murder the stack and drown the garbage collector for no reason. So don't do it.
The essence is: "If you have masses of dynamic data points in a realtime application, don't throw OO at 'em."
Edit: Caveat: Some scenarios are not well-suited for OOP, so it's important to evaluate on that level in the first place.