Eles trabalham de maneiras completamente diferentes.
Os usos do unbuffer do programa esperam executar o comando nomeado. Como o expect cria uma pseudo-tty para anexar ao stdout do processo filho, o filho pode ser levado a pensar que deve usar o buffer de linha em vez do buffer de bloco. Alguns programas mudam seu comportamento quando isatty (stdout) é verdadeiro, outros não, e é muito difícil saber qual vai e o que não vai.
O programa stdbuf tenta colocar libstdbuf na frente da libc para binários carregados dinamicamente. Onde libstdbuf redefine a estratégia de buffer padrão das chamadas libc stdio.
Eu descobri isso por
apt-get source expect coreutils
e lendo a fonte relevante para cada programa.