Mein letzter Stand (auch schon wieder ein paar Jahre her) ist, dass heutzutage komplett andere (und viel komplexere, uff) Algorithmen verwendet werden. Es gibt z.B. Middleware wie Umbra 3D (
https://en.wikipedia.org/wiki/Umbra_(3D_technology_company)) die sowas anbieten.
Ich hab vor Jahren mal ein Video dazu gesehen (das ich jetzt nicht mehr finde), die haben damals so Dinge gemacht wie die ganze Szene per CPU in einen Tiefenbuffer mit geringer Auflösung zu rendern um dann zu gucken, was tatsächlich sichtbar ist (Weil es einfach keine gute mathematische Formel gibt die dir sagt, ob ein Baum ein Haus verdeckt oder nicht).
Das man früher Levels als eine Abfolge von Räumen angesehen hat (und jede Tür war ein Portal durch das man in einen neuen Raum gucken kann) war eher der langsamen Hardware geschuldet und soweit ich weiß macht das heute niemand mehr. Erstens sind Level sehr viel offener geworden, zweitens hat man jetzt eher sowas wie Türen die nur mit Brettern zugenagelt sind, so dass man dazwischen doch die Außenwelt sehen kann.
Hardware funktioniert ja heute auch ganz anders. Klassische Baumstrukturen springen halt sehr viel im Speicher rum, was nicht Cache-Effizient ist. Man ist also unter Umständen effizienter, wenn man einfach tausende Kugel parallel durchtestet und ganz auf derlei Beschleunigungsstrukturen verzichtet.
Horizon Zero Dawn hatte eine sehr coole Lösung für Pflanzenrendern: Die Pflanzen existieren nur auf der GPU, für jeden Frame wird anhand von Verteilungstexturen berechnet, welche Pflanzen im Sichtfeld sind und die Draw-Calls dafür werden dynamisch generiert. D.h. man geht einen Schritt weiter als "Occlussion Culling" (man hat eine Liste an Objekten, und will alle rausschmeißen, die nicht sichtbar sind) hin zu "Ich generiere Objekte überhaupt erst dann, wenn sie gerade sichtbar sind".
Vor 15 Jahren haben Hobbyentwickler noch regelmäßig ihre eigenen 3D Engines gecodet. Damals gabs ja auch noch kein Unity oder Unreal d.h. es gab auch einfach nichts, was als Privatperson lizenzierbar war. Aber die Komplexität war halt auch viel geringer, sowas wie Half Life 1 kannste halt in deiner Freizeit theoretisch nachprogrammieren. Aber wenn man sich anschaut was in aktuellen Engines an Komplexität steckt, kann man das eigentlich vergessen. Der Vorteil ist natürlich, dass Hardware heute viel schneller ist, d.h. man kann auch einfach komplett auf Occlussion Culling oder LODs verzichten und einfach alles Brute-Force rendern. Natürlich kriegt man damit nicht die selbe Detailstufe hin, aber das ist ja ok.