проверять TG_OP или делать дополнительный триггер
Да, в общем-то и так и так нормально, смотрите как будет более читаемо
если триггер выполняется на большем кол-ве строк операция now() будет вызываться на каждой из них?
Да, собственно, как и написано в объявлении триггера "FOR EACH ROW", то бишь для каждой измененной строки. Ну, конкретно по поводу now() я бы сильно не волновался, это же время на начало транзакции, оно не меняется, то есть, скорее всего просто достается число из ближнего кэша. А вот если бы там была длительная операция вместо now(), вы бы ее в триггер не засунули бы, верно?
Впрочем, если вам принципиально проставлять время один раз для одного SQL-запроса, то можно объявить триггер "FOR EACH STATEMENT", он будет выполняться один раз для каждого запроса. Но в нем, понятное дело недоступны таблицы OLD и NEW, то есть каким-то отдельным запросом надо время проставлять