What is a more straightforward way to do instance culling?

Some example code for my current solution to simply rebuild the buffer each frame based on what instances I want drawn (after culling). Is this considered a particularly slow way to do it? There’s a chance this is all the performance boost I need, but I’d still appreciate any insight into a more proper way to deal with buffering some data per frame.

glBindBuffer(GL_ARRAY_BUFFER, buffer3);
glBufferData(GL_ARRAY_BUFFER, tallGrassAmount * sizeof(glm::mat4), &tallGrassTransformsCulled[0], GL_STREAM_DRAW);

glDrawElementsInstanced(
GL_TRIANGLES, grassModel->meshes[i].indices.size(), GL_UNSIGNED_INT, 0, tallGrassTransformsCulled.size()
);