I am reading those articles she gives to me, I think they would be helpful.
She is actually a he. Just pointing out.
The problem you are seeing stems from the nature of your blend operation. Every surface slightly darkens what lies behind them, which allows the user to percieve an order of the surfaces, but also means that the order of mixing together the colors is important. There are other blend operations, like additive blending (glBlendFunc(GL_ONE, GL_ONE);) where the order doesn't matter. Can you get away with additive blending?
If not, mixing the colors of different surfaces seen on top of each other must be performed in the correct order: Mixing from back to front. As you already know, there are multiple, very different approaches, to achieving this. Some require you to write shaders, some only require you to do s.th. with your meshes, some work in all cases, some only if you can make certain geometric assumptions for your modell or allow for certain artifacts.
For example, consider a single convex object. If you render the back facing triangles first, their color will get blended with the background color. If you now render the front facing triangles, their color will get blended with the result of the previous blending operation and you get the correct result. So for a single convex object, you can get away with the simple trick of rendering the back faces first, and then the front faces which will, for each pixel, always be closer to the camera. Automatic and perfect back to front sorting. Sadly, you have more than one object, and those intestines are far from convex.
So exploiting convexity is out of the question, at least directly. Which leaves you with 2 questions: Do you want "perfect" results? Do you want to use shaders, or do you prefer a geometric solution?
Haegarr is suggesting a geometric solution: Cut your scene into pieces (or your objects into subobjects) and sort them back to front. But what pieces? Is it enough to cut them into convex pieces? The answer is no, just cutting them into convex pieces will not guarentee artifact free pictures. For example, assume that you make one subobject out of each triangle (a single triangle is convex). Then there are certain situations where you can not find an ordering for the triangles, that lead to a back to front rendering. For example, consider these 4 quads (also works with 3 triangles), where each quad has one end in front of the previous but behind the next.
DD BB
AAAAAAAAAAAABBAA
AAAAAAAAAAAABBAA
DD BB
DD BB
DD BB
DD BB
CCDDCCCCCCCCCCCC
CCDDCCCCCCCCCCCC
DD BB
For these, no correct rendering order exists. At least one of the quads has to be split. This is the point, where you have to decide, if you can live with the occasional artifact, or if you want to descend into the ugliness of splitting faces, and inserting them into a BSP-tree or s.th. similar.
If you go the geometric route, I would follow haegarr's advise: Automatically cut the objects into smaller, approximately convex and not elongated pieces, sort those pieces back to front then render each object twice, first by culling away the front faces (only rendering back faces) then by culling away the back faces (only rendering front faces). Then take a look at it and decide, if the remaining artifacts are acceptable, preferably while experimenting with different parameters for your cutting algorithm. However, keep in mind, that the geometric sorting approach can get very ugly, so if you have the compute power to spare, and the time to read further into OpenGL, then Depth-peeling and other "order independent transparency" techniques can be a reasonable choice.