My preferred is rebase (exactly as you describe) but keeping the original fork point, (
unless it becomes necessary to depend on some other later work from another branch, the original base or not)
and then merge.
So you end up with a cleaned-up branch history via rebase, and a master branch that's similarly clean, with a higher level view of 'logical commits' that 'merge X feature', 'merge Y bug fix'.