Sitecore recommends limiting number of items to up to 10 versions per item.
The version manager module can be used to limit the number of item versions. This can either be run periodically, or when the number of item versions goes above a set number. When run, the module deletes old versions of the item.
I recall that this module used to require the user running the operation to have permission to delete in order for the old version to be removed.
Rather than delete old versions after a certain limit, we want it to only delete versions which aren't either currently on live, or queued up to go live via publishing restrictions / lifetime. This way, the module doesn't end up "unpublishing" items, regardless of age or version count. Additionally, rather than delete the version, we would like to copy the version being removed to an archive. Copying to the archive will preserve references to any datasources, but we would also like to see if there is a way to take a snapshot of any dependencies on the item being archived.
I would be interested to see how others have dealt with ensuring version numbers are kept low, while continuing to support the stacking of future items, and keeping an archive, in order to be able to view past versions.