-snip-
While -due to the nature of the halfing- this might never be reached, its still the limit. Thus my wording of "almost" 21 million in the next sentence.
It seems odd to say something "is the limit" if it is higher than the maximum possible value. It's a bit like saying that the limit of human lifespan is 10,000 years, just because I define MAX_LIFESPAN as 10,000 in some program. And then saying:
"While -due the nature of actual human life- this might never be reached, it is still the limit."
On the other hand the limit set by MAX_MONEY is very close to what will be available in circulation while 10,000 is far from 123 years or 130 years. I also think its fine to say there will be
almost (see your own list for more) 21 million coins.
Also wouldnt it be possible to increase the precision which determines how much bitcoin (or rather satoshi in the future) will be generated. E.g. use 128, 256, 512, etc. bit integer instead of 64 bit integer. So instead of setting the reward to zero [1] it would be fractions of a satoshi... while AFAIK we still wouldnt reach 21 million coins in finite time the difference would be infinitesimal small. I think it would require a fork though, as "old" clients wouldn know how to handle .1 satoshi.
[1]
https://github.com/bitcoin/bitcoin/blob/93f97aab629d6d3b7e2c296b24fc37eef9502cd1/src/main.cpp#L1159