Is it recommended to format the computer and start fresh after upgrading?

Noone I know does this.

I do this every 1-2 major OS releases. Copying from backup gives you a cool total defrag for system and user files, and cleans up all the BS that has accumulated (config files, stuff no longer need, use, etc).

I have a script that installs all my settings, brew packages, etc, even App Store apps, from external backup disk -- I'm up and running in 2-3 hours after the base install.

Any chance you have this script on GitHub/somewhere public?

I don't have it polished enough for that, but the gist (no pun intended) is:

I keep all my documents in a single folder called ~/AAA (so it lists on top) with subfolders like /WORK, /PHOTOS /CODE (e.g. /CODE/GO), /MUSIC etc, so I can just rsync that and be totally backuped.

Inside ~/AAA I also have a folder called SYSTEM_FILES, where I keep stuff like bashrc, vim directory etc. My ~/.bashrc etc are just symlinks to ~/AAA/SYSTEM_FILES/bashrc.

So I start with a script that rsyncs the AAA folder from the backup disk to ~ on the Mac, and then creates the appropriate symlinks for .bashrc, .vimrc etc.

Now all my documents are on my Mac and I have a working shell.

Then the script does:

  # install brew
  /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  # a number of brew related installs
  brew install rsync
  brew install mercurial
  brew install watchman
  brew install binutils
  ..

  # some brew-driven font installs
  brew tap caskroom/fonts 
  brew cask install font-roboto-mono
  ..

  # install various linter-related stuff for my ST3
  brew install -g node
  sudo npm install -g eslint
  sudo npm install -g eslint-plugin-import
  sudo npm install -g eslint-plugin-react
  sudo npm install -g babel-eslint
  pip install flake8
  pip install requests
  ..

  # install various big packages from casks
  brew cask install vagrant

  # install mas -- a mac app store cli client
  brew install mas

  # use a wrapper script that extracts mas ids from the apps I want
  ~/mas_install.py Pixelmator
  ~/mas_install.py Skitch
  ~/mas_install.py Evernote
  ...

  # use a shell script to copy .bashrc and co
  # create symbolic links etc
  ~/prepare_environment.sh

  # configure the Mac with various "defaults" options
  defaults write NSGlobalDomain AppleShowAllExtensions -bool false
  ...

  # finally the script sets up Mail.app, copies my Sublime Text packages to the ~/Library/Application Support etc.
You may want to check out https://github.com/Homebrew/homebrew-bundle which will allow you to do a bunch of that in a single file. https://github.com/mikemcquaid/strap and https://github.com/benbalter/plister may be of interest too.