seems you have a little bit of different things adding up. simply put, Unreal isn’t super efficient at rendering large amounts of dynamic actors (which seems reasonable).
some of the obvious solutions would be simplifying what the player can build. more granularity means more freedom for players but also means more rendered meshes. I don’t know if your granularity is at walls/doors/etc level, entire rooms, or even entire houses/structures. but in general reducing the granularity would reduce the problem.
in my game with spawned dungeons I had fully modular level assets, but for some very recurrent cases I had versions of those meshes attached at the art pipeline level. for example I would replace 4 tiles of 1x1 floors with a pre-merged 4x4 floor. in your case being user-built it’s much more tricky but it might give you some ideas.
the dynamic rendering path (movable actors) has a higher cost than the static rendering path (static actors). spawning dynamicSMActor static meshes makes them being drawn on the dynamic rendering path.
in my spawned dungeons I had a StaticMeshActorSpawnable class child of DynamicSMActor_Spawnable, and in the defaultproperties I had
give it a try, it might help making your spawned meshes a bit lighter in a few categories.
you also have a lot more shadow and lighting drawing. probably normal for shadows if your objects cast dynamic shadows, but the lighting part seems strange. if you have dynamic lights with shadows spawned on your player structures you probably want to disable them by distance.
lastly there’s always the option to distance-cull your spawned meshes, decals, particles, etc. not sure how much of that you’re already doing, but distance-cull would lighten the occlusion culling pass.