None of the above. Create a powershell script to create sites, subsites, lists, etc. Specifically, check out the pnp powershell library, and more specifically, the pnp provisioning framework. Since it uses the CSOM, it can be run from remote machines, and is compatible with different versions of SharePoint, including online. (You may have no plans for a migration at the moment, but when you do move to a new version, it's nice not to have to spend a huge amount of time rebuilding these things.)
If you need to have a user create these sites without powershell, use the pnp libraries from a separate application that is called from SharePoint. Again, this way if you migrate to SharePoint online, for example, the provisioning application can simply be moved to Azure. Another benefit is that the provisioning code can be deployed and updated without having to recycle any app pools, etc.