I would create two fixlets and put them in a baseline – one for the uninstall commands, with relevance to detect that the product you’re uninstalling is really there, and one to install, with relevance to detect that the product you uninstalled is really gone (and that the new one isn’t there yet). This technique lets a single action bring all the machines from an unknown state to a known state, and provides safety valves for covering failed actions.
CMD wrapping is useful when you need to ensure a particular CWD (e.g. there’s lots of files in addition to the MSI), but it also makes it a little tougher to work with exit and error codes.
Also, the new software distribution tool can assist with the creation of those fixlets, if you get a chance to check it out.