If anyone is curious I know why this takes so long. It's not trying to replay all of webkit, and it will succeed if you wait long enough (though I'm not sure how long it will take - certainly much longer than an hour or two).
If you do "git rebase origin/master mybranch", then under the hood it eventually ends up executing the equivalent of "git rev-list --cherry-pick --right-only origin/master...mybranch", *not* "git rev-list origin/master..mybranch" (with only two dots) as you might expect. This means that instead of just finding all the commits on your branch that don't exist upstream, it *also* finds all the commits upstream that don't exist on your branch (i.e. all 180000 webkit changes), and then goes off to calculate the patch id of every single one of them, to see if any of your changes have been applied upstream already. This is a pretty expensive operation :)
The reason it does this is so that if one of your patches is applied upstream already, it can skip it instead of trying to reapply it on top of upstream, since if the affected files have been changed since then reapplying it might fail and generate conflicts.
By using Primiano's command, you avoid this performance cost (because using the merge base as the left arg here means that side of the symmetric difference is empty), but also give up the ability to recognise if your changes have already been landed. :)