If I open a single port to my home server, then anybody can send any traffic to my server on that port. The attack surface is exactly the process running on my home server, listening on that port.
If I use the cloudflare tunnel, anybody using my web service connects to some cloudflare server which transparantly forwards, through the tunnel, everything to the process running at home. The attack surface is ... exactly the process running on my home server, receiving everything coming into the tunnel, effectively listening on the port opened on the cloudflare server.
Where is the difference? Any security issue in the process running on my server that can be exploited by sending traffic to it is attackable in either case.
Does cloudflare filter the traffic in any way? How does it know what's good and what's bad traffic?