Most backup solutions save files that are not needed for individual file restore, e.g. caches. To avoid this, subvolumes can be used, but are restricted to subtrees. Full backup is more arduously then.
With rsync, exceptions can be declared, e.g. excluding all directories with the name trash, or single files, easily updated:
.cache/
cache/
[Tt]rash/
/swapfile
First variant is to create the snapshot on the sender's side as writable, remove all unwanted files and set it to read-only for the following btrfs send .... Done before send, then never changed again. Fairly simple.
Second variant is to delete the useless files when old versions are thinned out. The advantage is that the latest version(s) are complete and can be used for full restore, while those far in the past are used for file restore and can thus be much smaller. More complex, and snapshots are changed long after done.
The article Anyway to apply filter while btrfs subvolume snapshotting? tells that there is no filter in btrfs-utils, thus a similar procedure was proposed.
Which one is better, deleting before the send, or after the receive?