One simple question, though: how are you initializing the vertex positions? Randomly? Have you tried changing the random seed to see if this is an isolated instance? It doesn't matter which positions they are started from (another spring algo, circle or random). Also it happens for structured data as well (not just my random example).
If it isn't an isolated case, you may want to try changing the "force_pairs" argument to the Fruchterman-Reingold algorithm. It's currently using the "grid pairs" version, but there is an all-pairs version (bad for disconnected graphs) and you could probably write one that is distance-based, e.g., u and v repulse if they are within some distance threshold of each other. That variant will be as slow as all-pairs, but will work on disconnected graphs and should not have this behavior. True - but I was hoping to avoid making it too similar to my existing sping algorithm!
Thanks, Gordon.