お世話になっております。
返信が遅くなってしまい申し訳ございません。まずご提示された各方法について述べますと、
・PlayerControllerに処理をまとめ、他の入力処理もキャラが請け負う
例えばアクションやRPGなどのゲームを想定した際、マップを移動するキャラクターが存在する場合、操作キャラクターの処理はImputComponentにBindして実処理はCharacterクラスで行うのは正しいかと思います。ただし上記で述べられているように、PlayerControllerでメニュー画面や会話画面などのキー操作も管理するのは非常に煩雑ですので、"メニュー画面中"や"会話画面中"といった状態管理程度に留めるのが良いかと思います。この尺度はコンテンツによりますが、全ての操作をPlayerControllerで管理するのは複雑になります。
・操作方法が変わるタイミングでPawnを切り替える(今回の例の方法)
既に検証や想定されていますように、操作方法が変わるとPlayerControllerのPossess/UnPossessでカメラとそれに伴う位置同期の権利も移行します。そしてこれは仰る通り、歩兵から戦車といった操作対象のPawnが変更するような際にご利用頂くのに適しているものです。PlayerControllerやPlayerCameraManagerをoverrideすることでカメラを固定することも可能かと思いますが、この方法では所有者とViewTargetのPawnが不一致となり、プレイヤー管理の面でも複雑になります。
・PlayerControllerを切り替える(こちらはよい方法ではないとの情報を見ました)
PlayerControllerはGameModeに基づく一対の存在であるので、PersistentLevelに変更が無いケースでPlayerControllerを切り変えるのは望ましくないと思います。
・他の方法(InputComponent切り替え?など)
InputComponentで切り替える方法が管理しやすさで優れていると思います。例えば、マップ中を移動するキャラクターの操作はImputComponentAとしてBindし、メニュー画面では専用にActionをBindしたImputComponentを生成しておきます。そしてメニュー画面が開かれた時に APlayerController::PushInputComponent()で、メニュー画面のバインドに切り替えます。メニュー画面が閉じられた時には APlayerController::PopInputComponent()でメニュー操作のバインドを解除します。これでImputComponent単位での切り替えが容易で、かつPlayerControllerはそのImputComponentの制御のみを担うだけで良いです。また、ProjectSettings->Input->Bindingsではキー入力の設定をそれぞれ登録可能ですが、UPlayerInputを派生して複数のBindingsのパターンを作成しプリセットとして扱うことで、同じキー入力でも異なるActionNameを扱うことも可能です。同じActionNameを使い回しすぎることは操作として一貫性はありますが、汎用的な名前にせざるを得ないので、プロジェクトで独自にBindingsを追加してカスタマイズされるのも良いかと思います。
上記はPlayerInputを主体とした管理ですが、Widget側からも UUserWidget::ListenForImputAction()でBindされたActionから呼び出しが可能ですので、単純なWidgetであればこちらで完結することもできます。

最後に付け加えますと、入力の制御はデバイス、プロジェクトの規模、コンテンツの内容に依存するため、最適な手法はプロジェクト側で見つけて頂くことになります。入力の制御に関しては、UInputComponent、UPlayerInput、APlayerControllerが主に担うので、まずはここをプロジェクトに併せて派生先で拡張して頂くのがよろしいかと思います。更にご質問がありましたらお知らせください。
よろしくお願いします。