Fiz algo parecido para cache de sessão aqui no BloodLink. Unlogged table resolve bem o throughput, mas tem um detalhe crítico: em crash, o Postgres trunca a tabela no recovery. Para webhooks isso significa perder eventos não processados.
O NOTIFY também tem uma limitação não óbvia: se o listener não estiver conectado no momento, a mensagem some. Então a tabela funciona bem como fila, mas o NOTIFY serve melhor como sinal de 'vai buscar' do que como portador da mensagem em si.
Se o caso de uso aceita perder eventos em crash e o listener é estável, a troca por Redis faz sentido. Quanto de memória você está tentando economizar?