Redirect user from a custom access callback
For the second condition an access denied doesn't seem to be the right answer because permissions are not the reason. It is to control the business logic and for this I think it is a good idea to use buildForm(), which acts in a form route as a controller from which you can return a redirect response:

  public function buildForm(array $form, FormStateInterface $form_state) {
    if (...) {
      $this-&gt;messenger()-&gt;addMessage('Fee already paid or no fee to pay.');
      return $this-&gt;redirect('&lt;front&gt;');
    }

    // build form if fee is not paid already

  }