There have been several questions asked on this site regarding the best way to provision sites and lists (definition schemas vs. templates vs. the object model vs. the web interface vs. provisioning providers). I have even responded to some of them.
There are a few rules of thumb to go by (resources, permissions, ease of deployment, granularity of control). One thing that has to be considered, though, is how do you propogate changes to a site definition to the sites that have been created from it. Changes to web templates only affect new sites that are created from them. My understanding was that this is not the case with site definition schemas (and list definition schemas). I understand that you can only add to a definition once a site has been created from it or the sites will break, but I saw the note on this page in the MSDN library yesterday and it concerned me: http://msdn.microsoft.com/en-us/library/ms434313.aspx
We rely pretty heavily on the object model to provision modification to sites once they have been created. At the same time, we have been fortunate to not have had many major changes to our site definitions post-production, but that won't last forever.
There is a blog post at http://mymemorysucks.wordpress.com/2009/02/25/site-definitions-vs-site-templates-and-site-provisioning-providers/ that makes a case for always using a provisioning provider over site definitions and templates, but I get mixed signals because the Microsoft developer exams seemed put a lot of weight on site definitions and templates.
So, what are the best practices for modifying your sites/lists after they have been created and are in production? How do ISV's, for example, handle upgrades to their SharePoint based software?