I agree with a lot of this, and I also used to think the long term solution would not involve manual hoisting, but I'm not so sure anymore.
I think we've invested too much in trying to remove manual prefetching, and too little in building good DX and tooling supporting it.
"Manually hoisting" is the solution that everyone has in their heads, and the reaction is — that's hard! And that's correct.
The long term solution will not involve manually hoisting.
Manually hoisting is a nightmare at scale (at least without linear types, lol) — there's nothing guaranteeing that every resource you load is actually used by the subcomponents in your tree. So you will end up loading more resources than necessary, especially in complicated UIs.
This isn't just a problem when when manually writing route loaders. It is also a problem when writing REST endpoints — they bloat over time for the same reason.
And it's also a problem when you call useQuery once at the root of a given component tree (which one must do for perf) — over time, that useQuery call will fetch more data than that tree needs, because it's easy to add fields but dangerous to remove them. (Who wants to risk breaking production so that a useQuery call uses 0.1% less bandwidth?)