others may have deeper wisdom than me, but for now:
ideally the process you followed on your dev box, is then repeated on production. If it is just customisations to existing modules - only the custom/ directory changes, so can just copy that across.
Good practise is keep all your files in Git; never make customisations manually /via Studio etc there - but on Dev: when happy, update GIT from dev and then and have a script to export from GIT to production. That way you are always 100% sure that production matches GIT: and you have easy)ish) roll backs - roll backs are vital!
upgrades - just do a dry-run on a Dev box -no need to uninstall anything first. If all features still work - all good!
@DJuser Yes that is more or less what I am doing. I am using an Subversion “SVN” server and not a GIT server which at the end of the day accomplishes the same task.