High-poly assets and very high-resolution textures can cause framerate drops. One or two are okay in an area but when there are lots of them, asset rendering in real time becomes an issue because the data can't be processed quick enough due to the high-resolution data taking longer to render.
Assets without LOD can also cause a drop in FPS because the rendering system is attempting to render a high-resolution model, which is fine up close, with the same number of polygons many meters away. This technology also causes pop-up buildings and assets. Yes, you will find this with a lot of older assets because LOD wasn't enforced. Today, that's a requirement but many users skirt it by using the same resolution meshes at all levels defeating the purpose of LOD.
If you are seeing this issue in a particular area of your route, copy the route and session and test in that test version so you can "wreck things" until you find the culprits. Hint: open the session and do a save-as and create a new route. This will take that operating session that you spent days or weeks setting up and makes that the default session and keeps everything intact with your new route to play around with.
With your test route and session, drive around and look in different directions. I run Trainz in a window and put the profiler on my second monitor so I can watch the FPS. If I see a drop when I look one way, but it's fine when looking another, this indicates that an asset or two, or maybe a lot of them in that area are causing a lag.
Sometimes, the problem can be caused by a faulty texture or mesh. I ran into this on my relatively smooth operating Gloucester Terminal route. I would look one way while crossing a river and I would get a big, and I mean what seemed like forever, pause before the drive became normal. After that pause, everything was fine until I looked that way again.
After stripping nearly all the assets down, I made a backup of the route first, I found the culprit. A very, very small, and I mean very tiny buoy had something wrong with it. After removing the buoy, everything was fine afterwards.
Since I solved the problem in a test version, I went back and implemented that change in the other version and the problem is no longer there.