They can't write into the depth buffer and that causes the effect that you see here. Imagine a tree with lots of foliage. Depending on the view angle, the drawing order of it's polygons might be back to front (fine for transparency) or front to back or something in between (most likely). If they would write into the depth buffer, all foliage that's rendered first would block everything that's behind it and that just doesn't look right. That includes completely transparent areas, because depth checks and writes happen before the actual rendering. That's just how it works, I'm afraid. Your planes are being sorted (if they are different objects) by using the simple, so called, painter's algorithm, but that's never perfect. If there is a set order that's the same in every case, you can apply a zsort-offset with some method in Object3D, but that's not applicable in most applications.
Another way to fight this problem, is to use a custom shader that doesn't do transparency but some kind of stippling instead. I did that for some trees in my game Naroth. Birch and oak trees are rendered as transparent objects, so that there might be unwanted polygon overlaps, but you hardly notice them if you don't watch closely. Pine trees on the other hand are rendered using stippling.