the only size limit is the block size, in other words you can inject a garbage data a little less than 1 MB in one transaction's output to the bitcoin blockchain. 20 byte (which is actually 40+OP_RETURN+push-byte size) is the standard rule that the bitcoin nodes are enforcing to reduce the chances of abuse. there is also transaction fees that will prevent such shenanigans to some extent.
the thing is that bitcoin is a payment system so it's "ledger" should only have to store payment data not arbitrary messages hence the "The best practice is don't."