In my experience a combination of technical and management processes work best here.
A typical suite of functions might have the following usage profile:
- Used throughout the typical working day
- Used periodically (daily, weekly, monthly etc)
- Ad hoc
- For specialists/power users
If you have user reps, get these to do the donkey work for you. You don't want to be asking every single user detailed questions, waiting for responses and collating the data. That is the definition of ballache. And besides, it isn't really your job.
Where possible, add (or investigate existing) functionality to be able turn features on and off. This may (but not always) involve code changes. However, it could be as simple as tweaking a config file, removing a report template, updating a database row etc. You might also want to consider stubbing out code based on conditional compilation etc. If this sounds like a drag, then consider that should you wish to mothball the function, it is easier to toggle it rather than rip out huge chunks of code.
Once both have been done, you should have a fairly good picture of your function usage profile. So armed with whatever tools you developed in the technical process, turn off the features you believe aren't used.
You could provide a grace period for turning the features off but this should have an end date by which time it will be turned off no matter what. You might be tempted to send out an email/memo asking people to agree to this first but don't do this. Someone always sits on their hands, claims they were too busy or is on holiday etc etc. As the great Grace Hopper said: It is easier to ask forgiveness than permission.