Zero-fee transactions are permitted by the protocol rules, but there is no incentive to give away block space without getting paid for it. Generally zero-fee transactions are a thing of the past since the 0.12.0 release disabled coin-age-priority as a criteria for transaction selection during block building.
By default, nodes today only relay transactions that pay at least 1 s/vB (250 s/kwu). The same minimum feerate applies also when selecting transactions for block templates. Generally, transactions that pay less age away without getting confirmed (and most likely don't get relayed in the first place).
This may change slightly if/when package relay is deployed, which would facilitate transaction packages to be included together in blocks that in sum pay more than the minimum feerate even while some of the transactions in the package may pay less than that individually.