Pessoalmente, eu colocaria no servidor de aplicativos. Aqui está o porquê.
O PGBouncer basicamente implementa o pool de conexões, que é uma coisa útil (embora às vezes irritantemente problemática) que reduz a latência geral do aplicativo, removendo o custo de configurar uma nova conexão com o banco de dados. Em muitos casos, isso é feito pelo próprio driver de conexão do banco de dados - consulte o driver ADO.NET MSSQL no Windows, PDO no PHP, etc. etc. O objetivo principal é minimizar o custo de tempo entre o código dizendo "Preciso falar para o banco de dados "e, em seguida, ser capaz de realmente começar jogando comandos SQL ao redor.
Os drivers mencionados acima implementam o conjunto de conexões, portanto, o código precisa fazer muito pouco antes de chegar ao ponto em que o banco de dados pode receber comandos SQL.
O PGBouncer é um caso estranho, porque você ainda tem que abrir uma conexão com o daemon do PGBouncer, onde quer que seja. Como você está tentando minimizar o tempo de conexão, faz sentido colocar o daemon o mais próximo possível do código do aplicativo. Idealmente, você se conectaria através de um soquete na mesma caixa, assim você não teria que passar pela ladainha do TCP apenas para chegar ao pooler de conexões.
Tal como acontece com tudo, YMMV. Teste, teste e teste um pouco mais.