Although there are advantages to using noise functions (mainly avoiding pattern repetition), most are disadvantages. As you said, Moire patterns appear and aliasing is hard to do. Distant grass just disappears since the texels are too small to be drawn and no mipmapping is available. I had no idea how to fix all of this so I just focused on the texture based approach and hoped that worked better.
if I do it explicitly, the hardware balks and refuses to generate so many vertices.
That's the main problem with geometry shaders (apart from being slow for tessellation which is what they were supposed to be used for) and why their use is so limited. But I'm sure we can get around those limitations with some kind of LOD system. At the end of the day no one cares about grass when flying.
I just tested your implementation and it looks amazing! I guess we should stick to the noise approach.