I guess I can't speak for everybody, but the majority of the lights in my scene don't move. They're street lights, etc., that I want to affect things that do move, so they need to be dynamic, but I don't need them to move around in the scene. So, with a scene that is 2km², I could divide the world into 64x64 (4096) 32m² chunks and sort my lights into them using a quadtree. Yes, that's a lot of chunks, but even if I allow 16 lights per chunk, with a 2-byte index each, I am only using 128k of memory. And most of my lights would only have to be sorted ONCE. I would only have to sort the moving lights (vehicle headlights, etc.) once per frame. Then, when I go to shade a pixel, I simply calculate my chunk index from the fragment position, and that index will give me the list of lights that affect that chunk.
A few reasons why I suspect people don't do this:
a) They have a lot more dynamically-moving lights than I do (e.g., from laser-fire and whatnot).
b) They have so many lights that a 32m chunk size is way too huge.
c) You lose alignment with the 8x8 screen-space tiles, which can cause performance problems. (edit)
Is there anything else I am missing?