Note also that while a zero-fee z2z transaction is identifiably distinct from fee-paying transactions, nothing is revealed about the values of the inputs or outputs, so a zero-fee zero-value “message-only” transaction is indistinguishable from a zero-fee value transfer.
A zero-fee zero-value transaction is slightly easier to create and mine than a value-carrying transaction, as dummy inputs are not required to be in the global commitment tree, and thus can be created independent of transactions that are currently in the mempool, whereas value-carrying transactions cannot spend unmined notes. I say “slightly” because note sharding and management can achieve close to the same outcome (as e.g. Zbay is doing by ensuring some minimum number of notes are in the wallet). In any case, imposing a minimum fee across the network would trivially remove this difference.
zcashd's default mempool-selection rules would mean that in the case of many zero-fee shielded transactions and a few fee-paying transparent transactions (which are prioritised below all shielded transactions), the zero-fee transactions would take up at most half of a block before the fee-paying transactions would be selected.