You’re absolutely right about LOD, and I’m about to make new trees now using the “sapling” addon for Blender which also will make it easy(ier, rather) to make several layers of LOD.
Regarding foliage I agree with you that there should be put more an effort on that. I have a few ideas myself, if you could use a different texture based on the objects angle to the camera, you could make a sprite that always faced the camera. Use a texture that contains an image of the object from several angles and map the correct part of it to the texture. This way every object you saw from a long distance would only contain 1 face and one small texture.
An engine should be able to do this live. For each object using the same mesh and approximate world rotation/location/animation state (again dependent on quality/performance), render only one of them to a texture w. depth/normal information. Draw the rest of the objects as sprites, possibly use a particle system (but I’m speculating), and fix overlapping using the depth information and lighting with depth+normals.
In a worst case scenario you’d have nothing that overlapped, meaning you’d have no performance increase but the cost of running the algorithm. In a best case scenario you’d only draw the object once, possibly causing a massive performance increase with minor loss of picture quality.