Unless you have crazy detailed models and or really vast open spaces - LODs are probably the last optimisation to consider. And if you generate geometry at runtime, LODs indeed may just cause more trouble.
Instancing (ex. use 1 material for the entire scene and textures / shaders to adjust it’s looks on specific elements if needed) + batching + for cylindrical elements always a good idea to render them as just Lines if they are far away from the camera - there’s no way to distinguish between Line and cylinder far away, and the first one is way cheaper to render. If you’ve done all that, and removed all performance bugs / obvious bottle necks, then as a last resort you can use impostors (but it’s not trivial and an overkill in non-open-world cases, so make sure it’s just really needed
)