Indices into a Vec is actually the right call for most real systems. I've shipped production event processing pipelines with this exact approach and it's solid.
The Rc<RefCell> crowd will tell you it's "simple" but you're trading simplicity for runtime overhead and subtle aliasing bugs. Arena allocators are great if you're building a compiler or game engine, but overkill elsewhere.
Generational indices are clever but add complexity. Your current approach gives you O(1) lookups, predictable memory layout, and no surprise panics from stale references. Just document it clearly and move on. Don't let theory push you toward worse code.