I mean you can group a set of components and simply copy this group wherever you want. There is literally no difference, and this is what we did because of the 1 document rule we gave ourself. But what makes actually a definition so big? There is a lot of components used to do data management. 1/3 to even 2/3 of a definition is exclusively used to access and organizing data.
Scripting in Grasshopper is not about writing 1 single component. Its about writing a bunch of components following a greater purpose. One setup I often did was, when doing generative patterns on cars:
• Process input
• Create a grid/ curve basis
• project/pull/morph the grid to the shape
• build front surfaces in 3d
• build side surfaces/flanges
• fillet or at least prepare surface fillets
• cut or close the back and to the frame
• prepare data to post process manually
Because of the clean encapsulation the output generated was whats enough to visually confirm the algorithm. If thats not enough you can quickly override the preview and add certain geometry to render. Of course writing scripts takes more time, but it pays off in the end. You not only get better results, your code is better readable and much more reliable, since conditions are much easier to integrate. On the other hand, if you can do things shortly and nicely without scripting, nothing speaks against doing it like this. You could also tests things with native components and improve and refine by code in a second step.
However at least the job I was doing back then, creating quality results strongly overweight quick and time critical workflows. And this is a philosophy you rarely see in the Grasshopper world. In my opinion its not about creating endless combinations in a very short timeframe to explore a design. Its much better to already have a clear idea which only needs to be well implemented by the help of algorithmic modeling. It also helps of course to know what should be done in GH and whats not.