You could create a custom field for all contacts called "Status" with options of Active and Archived. That will give you the selection you need in most places to easily include / exclude the appropriate contacts, especially on many reports and Advanced Searches. Then create two smart groups - Active and Archived - which include the appropriate contacts, and that will make the selection easier in most other places. Depending on the size of the database, how often you are rebuilding the smart group cache, and your host, you could take a hit on performance, so you have to use your judgement there.
This isn't transparent to users, but at least it's easily understood and it's simple - if they are Archived, check the field on the contact record. This gives you the flexibility of including the Archived contacts' contributions, event attendances, etc, when you want to compare numbers across years, but excluding them easily when creating current communications, etc.
The other thing I like about this is that it makes keeping the database up to date everyone's responsibility in real time on a going forward basis. There are going to be even basic users who learn of a contact that leaves an organization, or moves away, etc. This gives them the ability (and hopefully the responsibility) to mark that contact as Archived in the database as soon as they get the information, instead of waiting to tell someone, or for it to be caught the next time six months from now when someone goes through the database to find the Archived contacts.