Normally I consider it a best practice to perform a fresh installation and to migrate data and applications to a new system when considering major OS releases. This ensures the minimal degree of complexity when it comes to things like data format or configuration file changes between versions and generally ensures that you're getting the new release as it was intended by the developers rather than potentially carrying over various configuration choices or legacy features from an earlier release.
However, there are circumstances where this is not possible, or where the simple speed and simplicity of an upgrade will outweigh the benefits of performing a fresh installation. This is a supported upgrade method for Debian.
I will document my notes on this process here.
Debian 9 (stretch) to Debian 10 (buster)
<insert notes here>