Note: this is not an either or.
You can create grass in a geometry shader.
Or you can batch entire sections of grass as geometry.
Creating an entity per blade of grass is going to be pretty ridiculous… that’s why no one does it that way.
Note: to OP, even if many of the existing examples are procedural it doesn’t negate the actual setting up of a mesh… which should be reusable no matter how the data got there. It’s all about batching. (if not doing geometry shaders.)