Btrfs snapshots work fine for local backups (as does rsync with hardlinks if you do not have a Btrfs filesystem). However, if you want to have a 3-2-1 backup strategy, with one backup off-site, things become more complicated because you then need some kind of filesystem access on a remote system. While this is not impossible (a server system from a hosting provider with SSH access will do nicely), it is more involved than, say, some S3 compatible object storage, which is purpose built for remote, API-accessible data storage without having to manage your own server. (Note, there is https://rsync.net, which offers a similar, rsync-compatible data storage service. I have not looked into this in more detail as there are far more alternatives for object storage and thus more competition in this space.)
I use restic to snapshot my data onto a second drive locally and then copy (new) snapshots to a Backblaze B2 bucket every night (I am not affiliated with Backblaze, it is just what I settled on after comparing it to S3 and the other two big cloud storage players). You can of course combine Btrfs snapshots with restic for an off-site backup but using a single tool for both allowed me to simplify my setup.
Snapshots in restic are also very efficient (not as efficient as copy-on-write ones, of course) for slowly changing data sets. Data is deduplicated by splitting files into chunks and a snapshot only stores new chunks and references older, unmodified chunks. This makes creation fast (so you can snapshot often) and small (only new or changed data needs to be stored and transferred to an off-site location).
Also note, there are other, very similar backup tools like Borg Backup (command line tool, like restic) or duplicati (.Net based, with a web GUI). Years ago, I chose restic because it fit my use case best and I have not had any problems with it that would have made me switch to something else.