A fixed grid on an uneven world
Geohash boxes form a fixed grid, and the world you are indexing is not uniformly full.
A 610 metre box over the North Sea holds nothing. The same box over central Tokyo holds thousands of businesses. One grid size cannot serve both, so a fixed scheme is always too coarse somewhere and too fine somewhere else at the same time.
A quadtree adapts instead. Start with one box covering everything, and one rule: if a box holds more than a set number of points, split it into 4 and push the points down.
Your recursion stops where the density stops, so ocean stays a single shallow node while Tokyo subdivides a dozen levels deep. Every leaf holds at most that number of points by construction, and that is the property you came for. A nearby query drops to the user's leaf and its neighbours and reads a bounded number of points, whether they are standing in Tokyo or Wyoming.
That costs something, because a quadtree is a built structure. It has to live in memory, be rebuilt as points move, and be shared across your servers, all of it real operational weight that a string column simply does not have.
What the large systems use
Look at what the large systems converged on, because you can borrow it. S2, from Google, projects the sphere onto the six faces of a cube and runs a space-filling curve through each one. That keeps neighbours together better than plain bit interleaving, and avoids the worst distortion near the poles.
H3, from Uber, tiles the world with hexagons instead, and the reason is neighbour distance. A square box has 8 neighbours sitting at two different distances: the ones sharing an edge, and the ones sharing only a corner. Any calculation across neighbours comes out subtly lopsided. A hexagon has exactly 6 neighbours, all the same distance away, which makes smoothing and flow calculations behave.
Choose by weight rather than fashion. Geohash is a string column with no dependency to install, and it carries most products further than people expect. Quadtrees earn their complexity when density varies wildly and your points keep moving. Hexagons earn theirs when you calculate over neighbourhoods rather than merely searching them. That is exactly the surge pricing problem Uber built them for.
Worked example
Uber's early dispatch used a geohash grid and hit the density problem in exactly the way the theory predicts: cells sized for suburban Phoenix held single-digit driver counts, while the same cell size over Manhattan at 6pm held thousands, so the two ends of the system needed opposite tuning. Worse, surge pricing averages supply and demand across a cell and its surroundings, and with square cells the 4 edge neighbours sit closer than the 4 corner neighbours, so the same set of drivers produced different surge depending on which way the block was oriented. H3's hexagons fixed the second problem by construction, since all 6 neighbours are equidistant, and its 16 resolutions fixed the first by letting the city pick resolution 9 (about 0.1 square km) where Phoenix picks resolution 7 (about 5 square km). Uber open-sourced H3 in 2018 and Foursquare and others adopted it for the same reasons.