The codes you have mentioned in question do redirect effectively. Since Magento is not allowing to use redirect methods depending upon exit and die I had search for such methods which are already being used in magento core's observer for redirect purpose.
I have found few of them which I'm going to list:
1. Magento\Captcha\Observer\CheckForgotpasswordObserver.php
public function __construct(
\Magento\Framework\App\Response\RedirectInterface $redirect,
) {
...
$this->redirect = $redirect;
}
/**
* Check Captcha On Forgot Password Page
*
* @param \Magento\Framework\Event\Observer $observer
* @return $this
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
$formId = 'user_forgotpassword';
$captchaModel = $this->_helper->getCaptcha($formId);
if ($captchaModel->isRequired()) {
/** @var \Magento\Framework\App\Action\Action $controller */
$controller = $observer->getControllerAction();
if (!$captchaModel->isCorrect($this->captchaStringResolver->resolve($controller->getRequest(), $formId))) {
$this->messageManager->addError(__('Incorrect CAPTCHA'));
$this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);
$this->redirect->redirect($controller->getResponse(), '*/*/forgotpassword');
}
}
return $this;
}
Since it is included in core file I think this could be the one that can be used.
2. You may see the same method is used in Magento\Captcha\Observer\CheckContactUsFormObserver
and module-captcha/Observer/CheckUserEditObserver.php
as well.