I’m guessing just as you are but I would be surprised if performance is the primary reason. Sure, there’s memory overhead not just because you’re using an additional struct to carry the variables you’d have anyway, but also because a struct has to marked as Blueprint type in order to work with Blueprints, right? It can’t be a plain old struct.
My guess would be ease of use. You don’t want users of your code to have to pull out the struct pin, break on it and get the variable instead of just accessing the variable directly on the BP node. Other than that I’m clueless. When working in C++, I do it just like you do, using structs to act as “payload” parameter when there are a large number of variables to carry around.