That's generally how we approach it. Reason is, for certain installs (Firefox in particular) you don't want someone trying to install it on top of the existing application. You would think that users would know if Firefox was already installed on their systems, but some people just don't look in /Applications. If it ain't in their Dock, they think it not there. In the case of Firefox, installing on top of an older version tends to break the app. There is of course the case of upgrading, which requires preinstall scripts, etc. It would also call for a more defined Smart Computer Group looking for either Macs with No Firefox, or Macs with a version of Firefox not matching the current one you're publishing.
For larger package installs we'll tend to cache the package with one policy, build a Smart Group looking for Macs with the cached package present and use that group as the scope for the 2nd policy that installs the cached version, and drop that in Self Service. Its nice because it can make what would otherwise be a long install process (download large pkg, run installer, run recon) into a shorter process of just the install + recon.