I don’t know how all your code is structured and can only guess what is happening.
To support multi material I have formed groups.
Very many groups are then a problem for the performance.
I had a similar problem with my showroom. Jerky camera movement with many objects
There I am still in the process of creating a collected geometry for each material I want to use instead of creating groups in a geometry. Independent of the affiliation to design objects. The performance became much better. But this only works if the objects are static, not moving. A road is mostly static.
Another option for the road is probably Instanced Mesh.
https://threejs.org/docs/index.html#api/en/objects/InstancedMesh
I have not yet dealt with this in detail. But there are good examples and experts here in the forum.
Clipping plane for InstancedBufferGeometry
Instancing Point Cloud
Multiple textures with instanced geometry
See also my Collection of examples from discourse.threejs.org , e.g.
https://hofk.de/main/discourse.threejs/2020/AlphabetInstancedMesh/AlphabetInstancedMesh.html
https://hofk.de/main/discourse.threejs/2020/DynamicallyInstanceCount/DynamicallyInstanceCount.html
https://hofk.de/main/discourse.threejs/2020/EdgesGeometry-InstancedMesh/EdgesGeometry-InstancedMesh.html
https://hofk.de/main/discourse.threejs/2020/RaycastHighlightInstancedMesh/RaycastHighlightInstancedMesh.html
https://hofk.de/main/discourse.threejs/2019/RoundEdgedBoxesInstancing/RoundEdgedBoxesInstancing.html
https://hofk.de/main/discourse.threejs/2019/InstancingWithShadow/InstancingWithShadow.html
https://hofk.de/main/discourse.threejs/2019/TextureMappingInstanced/TextureMappingInstanced.html