You can set a fee that will most likely ensure that your transaction will be in the next block, but that can still take up to 10 minutes to get confirmed, and even waiting for, like, 5 minutes at the counter when paying for groceries is such a long time. And you're right that the cost of the transaction is also likely to be significant, compared to the small amount a person is spending. I think a solution to that is centralized services that rely on custodial wallets, or just using Bitcoin only for big purchases. Both have their downsides, of course, and point at limitation of BTC on-chain transactions.