A bit late now - but I noticed that this happens over the course of the ribbons life when the lifespan of the ribbon particles is not consistent, e.g:
Life = rand(1.0,2.0);
when a particle in the middle of a ribbon dies while its neighbors are still alive, it seems that the ribbon self-corrects by skipping the dead particle and joining the two neighbor ribbon particles in the chain, creating a break in the flow of the ribbon particles that often results in jarring straight lines, also it will pick a new TextureID for that section if you are randomizing that in creation, again jarring.
You can really exacerbate this effect with a more one-sided lifespan:
Life = select(0.02,0.4,ninja<0.1);
I fixed this issue in my case by making the lifespan of the ribbon particles consistent, e.g
Life = 1.0;
If you are doing multiple ribbons from trail evolvers and wanted some randomization in Life, you could always set a random field on the parent, eg
RandLife = rand(1.0,2.0);
and then set the life of the ribbon particle to inherit the parents field:
Life = parent.RandLife;
This will randomize the life between different ribbons but not within the ribbons themselves.