Marathon and Doom both do 3D kind of the same way, but there is one thing that makes Marathon more complicated.
Each level in Marathon is 4 dimensional.
If you export a level to OBJ using Weland, you will notice that the levels don't work as one 3D space.
Every polygon is a separate 3D space and the map itself is a 4D shape.
The player position is x, y, z and polygon.
Two players could be standing in the same x, y, z position, but be in different polygons so then they can't interact when in different polygons.
The maps are 2D
The renderer makes the maps 3D
The culling Marathon uses makes the maps 4D
The game loads and changes 4D maps so that makes the game 5D
This is why you have to think in higher dimensions when porting Marathon levels to Unity or Unreal.