We don't run anything on prod without a script and that script must be in source control. Additionally we have to write a rollback script in case the inital script goes bad and we have to back it out. And when we move to prod configuration management does a differential compare between prod and dev to see if we have missed anything in the production script (any differnces have to be traceable to development we are not yet ready to move to prod and documented). A product like Red-gate's SQl compare can do this. Our process is very formalized so that we can maintain a certification required by our larger clients.
If you have large tables even alter table can be slow, but it's still generally more efficient in total time than making a copy of the table with a new name and structure, copying the data to that table, renaming the old table, then naming the new table the name of the orginal table, then deleting the old table.
However, there are times when that is a preferable process as the total down time apparent to the user in this case is the time it takes to rename two tables, so this is good for tables where the data only is filled from the backend not the application (if the application can update the tables, it is a dangerous practice to do this as you may lose changes made while the tables were in transition). Alot of what process to use depends on the nature of the change you are making. Some changes should be done in a maintenance window where the users are not allowed to access the database. For instance if you are adding a new filed with a default value to a table with 100,000,000 records, you are liable to lock up the users form using the table while the update happens. It is better to do this in single user mode during off hours (and when the users are told in advance the dabase will not be available). Other changes only take milliseconds and can happen easily while users are logged in.