Unfortunately, I do not think there is a clean way to achieve this. User control is heavily dependent on the execution of the page life cycle and, therefore, the HTTP request. You also often have dependencies on the various parts of the Sitecore context that are created during the request.
With MVC, you have more options because you can directly call the Render method. But you still need to correctly create the model first. So you are probably still having difficulty.
As you said, this seems wasteful, but screenwriting is the usual way to achieve it. I know a couple of existing modules that use this approach to index page content.
source share