You're right that latency is not great, and on the fly indexing might not be feasible. Maybe a direct connection, bypassing DVMs and returning actual events would be a better interface. That's another implementation detail we can add later once the DVM model is proven.
The thing about using relays as aggregators is there's currently no way to know if they have the events you want. I drafted a NIP a looong time ago that attempted to solve this problem using relays: https://github.com/nostr-protocol/nips/pull/259. The idea is that a relay would be able to recommend another relay that indexes its content, and which supports the functionality the client is looking for. So small relays could still self-host, but rely on big indexers to serve search. Otherwise, clients still have to rely on centralized services like nostr.band and nostr.wine to find the notes they're looking for.
This is particularly bad with relays that enforce AUTH, since there's no way for an indexer to build an index for content exclusively on those relays. Authorized indexers (indexers that are authenticated with these private relays) are the only way to expose that data other than making relays build every search/discovery feature directly into the relay interface. So if a client wants to search/analyze data from a particular relay, they need to know who is indexing that relay. DVM requests allow clients to specify the relays they want to look at, which DVMs can answer or not depending on whether they index the target relays.
I'm not saying DVMs are integral to this process, just that they're the only things that exist that can support separating data and functionality right now. It would be fine to have a "search relay", or an "analytics relay" and for the NIP 11 document to point clients to themselves for search/analysis, or to some other relay for search/analysis.
A succinct way to describe my goal is: there should be no stranded data in nostr. All of it should be indexable and discoverable to the extent the custodian wants it to, however small the relay instance. NIP 50 search built into nostr.wine doesn't solve this.