An possible single-pass alternative could be to extrude silhouettes into quads in the geometry shader (much like you do for fin/fur rendering) and set one vertex attribtue to 0 on the original vertices, and to 1 on the extruded ones, so it ends up as an interpolated falloff in the fragment shader. For non-silhouette vertices, the attribute should be a negative value, so interpolating with the zero values at the object border always gives a zero-or-negative value, which you can clamp to zero (otherwise you would have glow outside, and inside as well, which isn't nice!).
This attribute can then be inverted (so it falls off the more distant a fragment is to the object) and fed to e.g. smoothstep or used as lookup in an artist-supplied 1D-texture and finally be colorized, green, or what you like (maybe with a little noise as well, to make it "more interesting").
That presumes, of course, that have a geometry shader functionality, but that is a pretty safe bet nowadays.
EDIT:
If dynamic branching is fast (acceptable) on the target architecture, the complicated clamping of the glow attribute isn't even necessary. Instead, every vertex in the object could just have that attribute set to 1 and the extruded ones would have 0. This would interpolate to 1 everywhere inside the object, and fall off to zero outside.
Then, assuming you use alpha, the fragment shader could be something really simple like if(glow_factor == 1.0) { color = shade_normally(); } else { color = vec4(GREEN, smoothstep(0, 1, glow_factor)); }