One way to look at the issue is that the confusion stems from giving the same name to operators of different types, namely the "Instant plus Period" operator and the "Period plus Period" operator.
Period could be implemented as a vector with independent components for days, months, and so on. (I don't know if that's how JodaTime does it, but that's what I would do if I wanted it to have a "plus" operation.) Then it could have a well-defined operator appropriately named "plus", which is both commutative and associative as one would expect.
"Instant plus Period", however, is asymmetric, and cannot satisfy the identities we associate with "plus". So let's give it a name that is also asymmetric. How about "advanceBy"?
2021-01-30.advanceBy(1 month) = 2021-02-28
2021-01-30.advanceBy(1 month).advanceBy(1 month) = 2021-03-28
2021-01-30.advanceBy(1 month plus 1 month) = 2021-03-30
2021-01-30.advanceBy(2 months) = 2021-03-30
That seems much less mysterious to me. Sure, a casual reader wouldn't be immediately confident about what advanceBy returns in all cases, but giving it a name that conveys its asymmetry helps a lot.