You can easily see it this way: a hardfork can occur in two ways:
- an update allows things that clients running older clients do not allow
- an update accidentally makes blocks or transactions that were already in the blockchain invalid
In principle, the first problem is the easiest to solve, a hardfork will only occur when someone uses the new feature before the majority of the network has updated to the new version. So basically, it would not be smart to start using new functionality immediately, because a hardfork between new and older clients can occur. However, in a certain amount of time, the majority of the clients will be updated and the new protocol can be used in it's entirety.
The second problem, however, is of a different kind. Practically, it can be solved just as easy, but it required all clients to keep track of this change so that they can explicitly only enforce the rule to new blocks. This can be done fairly easily by adding a hard-coded reference to the point at which this new feature has to be accepted to all clients. However, it's clear that this is not the kind of solution you want. If you need to hard-code these kind of things, the protocol will get cluttered.
So basically: removing functionality clutters the protocol and will be avoided, while adding functionality can be adopted fairly easily as soon as the majority of the clients has been updated.