Well, you could go back to regular alpha blending, and avoid the extra-bright problem where the ghost is self-occluding. Turn off depth write on the ghost object (in addition to putting him in the fixed bin) to avoid some of the artifacts you described with parts flashing:
Explanation: turning off depth write means the ghost will not update the depth buffer as he is drawn. This means that the parts of the ghost that are in front of other parts won’t be occluded by those parts behind him. However, depth test is still enabled, which means the ghost will test against the things in the scene that are already there, which is necessary to prevent the ghost from being drawn on top of things that should be in front of him. So this is good. However, in order for this to work, it is necessary that the ghost is drawn after all of the other objects in the scene have already been drawn, since you’re just laying down pixels on top of pixels that are already in the frame buffer. That’s why we put in him the fixed bin, which is drawn after all of the normal bins.
There will be issues with multiple ghosts in the scene, if one of them is in front of the other. You can reduce this by sorting all of the ghosts back-to-front, so that the ghosts in the back are drawn before the ghosts in the front. This will work as long as the ghosts are not very close to each other. To do this, you’ll need a special bin instead of the fixed bin; there’s another post where I demonstrate that.
But it still won’t be perfect. What I think you’re asking is for the ghost to occlude its own parts normally, but not to occlude anything in the environment. This is clearly outside the scope of any simple state attribute.
To truly achieve this effect, you’ll need to render your ghosts offscreen into a texture buffer (using normal opacity), then render the texture onto a card onscreen, and make the card semi-transparent. Of course, then you might have troubles if there is something in the scene in front of your ghost. You could solve that problem by copying the depth buffer from your original scene into your offscreen buffer, but now things are getting complicated.
Instead of using one big texture buffer for all your ghosts, you could render each ghost onto a card individually, then place each card in the scene where the ghost is. That would also pretty well solve the depth-buffer issue, and it might be simpler than the above suggestion. Still pretty complicated, though.
Or, you could model your ghost so that there are no self-occluding parts. That severely limits the shape your ghost can have, of course (he couldn’t be human-shaped, for instance). He would have to be fully convex, like a human in a plastic bag.
Or, you could live with the self-occlusion. As you said initially, it’s not awful.