I tried doing a RunService.RenderStepped:Wait(), but the parts were overlapping each other and I still got the gaps. I decided to wait(2/30) because the size of each part is Vector3.new(2, 2, 2) and the speed is 30 studs/second.
Also, are you moving the trails on the server? If you are, I would advise moving the trails on the client instead as they seem to be faster and appear much smoother, you could use remote events to accomplish such tasks.
However, there is still the problem of the random inconsistencies. Do you (or anyone else who might be reading) know of a way to adjust the wait time to consider frame rate?
Also to answer your question, yes I am creating and moving the trail on the client.