If $duration "guessed" the duration, it wouldn't be very good. And if you are displaying weeks and days as well, how do you get that decimal working correctly in the display?
For example, Feb 1 to March 1 on a non-leap year is 28 days. It's also 1 month. If you calculate months as 30.45 days or whatever, then it will not display as 1 month, even though it is. Obviously, once you have 100 weeks duration, a day or two here or there isn't a big deal (in most cases), but $duration is used for short durations AND long durations and having it be really wrong on short durations just so long durations look nicer isn't very good.
I've never looked at the coding in $datediff, but for $DateXpander, it uses the current month/year (or whatever month/year is chosen) and determines the exact number of days/months based on how many days/weeks/months/years there really are in the month/year. Try both out and see what you think. You can even use basically the same format for $DateXpander as $duration as long as you're doing a duration from the current date into the past (such as a !seen script). If you want to go into the future (a countdown) or have the duration at some other set of dates rather than from the current date, the format changes some, but it handles it just fine.