The easiest and already existing solution is certainly Usage: Backup and Restore - Docs
However, you should shut down Gitea for that.
If that is not what you want, you can either mirror the repos manually to the other instance (if it is a limited number of repos, but once set up it will continuously update the repos), or you build something yourself using the API.
I don’t see another way to backup the repos.
The docs don’t seem clear on when the mirror occurs. It’s says it will kick in shortly after being configured but is it then automatic after any commits or do does it run on a schedule, or is it manual?
Before 1.18 (not yet released), push mirroring only occurs periodically after a timeout you can set yourself.
From then, you can also specify to sync the mirror once a new commit is pushed (to the default branch, I think, but I’m not sure about that).
Pull mirroring always has to use an interval as it cannot guess when new content is available.