Daniel, it's hard to know if this advice is applicable without seeing what your projects look like, but from your description, I have a couple of suggestions for improving the performance of your assemblies.
First, it sounds like you're working in a flat top-level assembly where every component is mated independently. Maybe that's not the case, but if you are making thousand part assemblies with only 20 or thirty moving components then you should take advantage of the opportunity to modularize your design into logical assemblies. When componnets are part of a subassembly, their mates don't have to solve at every rebuild of the top-level assembly (unless you make the subassembly flexible), so employing a heirarchy to your assembly structure provides speed benefits. It also gives you more opportunities to re-use groups of components.
The second thing I took from your description was that you're creating a lot of incontext relationships amoung components to cut and size parts. In conjunction with a flat assembly, solving all of those upto-surface conditions can spike your rebuild times. If you are modeling welded frames or just prefab frames, you should look at using the weldment functionality of parts to make parts of your structure. The interface makes generating those miter cuts much easier and rebuild times are much faster because part features solve in sequence instead of simultaneously. OK, even if you had to make a screened patio, where everything was screwed together with splice plates, I wold still model the frame as a weldment and then have SolidWorks generate parts from the bodies and assemble them as prefab components. That way don't t have to create all kinds of time dependent features.
Finally, if you're stuck working in a flat assembly model with individual parts for the structural members, I would create a 3Dsketch of the centerlines of the structure to serve as a skaffold for mating the components so that they're not mated to a structure that frequently needs to be rebuilt. This also helps to avoid circular references. This also allows you to do your extrudes upto vertex using the endpoints of the 3Dsketch segements and then use simple cuts from sketches to form your miters instead of having to land the full face of one tube against another.
Your methodology of creating your structural pieces as virtual components is sound. Just beware that virtual components have a couple of bugs that occasionally can cause file loss. It's not a huge deal if your assembly contains two virtual components with 3 features each, but if you put all of your eggs in that proverbial basket and one of these bugs manifests itself, it could cost you a lot of work.
Given the choice, I'd rather create a lot of virtual components over creatinga lot of part configurations. Configurations don't really reduce file size or rebuild times and if you don't know your parts design intent really well, editing a part with configurations can quickly turn it into a mess of errors. Configurations are great when your parts are very clearly defined in the abstract and you know what most if not all of your permutations are gonig to be, not so much for creating geometry as you go.
Here's a couple other project examples:
Our projects rarely ever give us the oportunity to create subassemblies. Our joints are already subassembled, but when it comes to joint-to-joint assemblies, there isn't much we can do. I've had to set the majority of the sub assembly to fixed in order to speed things up when things got too bad, but it seems like a pretty cheap solution. We don't get anywhere near 1000 top-level parts/subassemblies. It's more around 100-200 at most.
I'll look into 3d sketches and weldements, but I'm not entirely sure on how to go about it because our structural components (pipes) don't define the dimensions of our projects, the joints do. We base the lengths, widths, and heights off of the distance between joints. The pipes are only in the drawing for visual purposes and for creating cut lists.