Как оказалось, первая проблема связана с особенностями работы pgbouncer. Суть в том, что pgbouncer не блокирует соединение, в котором есть активная транзакция, для других клиентов, а у нас в одном месте происходит довольно длительная (до 15 минут может висеть) транзакция на совершенно левой группе таблиц. В общем получалось так, что проходила куча update на одну строку из одной таблицы, и часть из них попадала в транзакцию, которая предназначалась для других таблиц, и потом, после комита, сервер еще долго разбирался, в каком порядке это все выполнять. Решение: оборачивать в отдельную транзакцию важные запросы на изменение данных (в нашем случае - обновление счетчика), даже если они ходят поодиночке.
А вторую проблему решили изменением структуры таблицы.