Нормально ли, что нотация функции противоречит здравому смыслу?
Для таких случаев придумали docblock (а начиная с php 8 - union типы):

# PHP 7+

declare(strict_types=1);

/**
 * @param int|string|float $a
 * @param int|string|float $b
 * @return string
 */
function summ($a, $b): string {
    return bcadd((string)$a, (string)$b);
}

# PHP 8+

declare(strict_types=1);

function summ(int|float|string $a, int|float|string $b): string {
    return bcadd((string)$a, (string)$b);
}

P.S. Помимо этого можно кастовать результат к инту, если он в пределах допустимого int32/int64 (зависит от ОС и сборки пыха) значения
return $result > \PHP_INT_MAX ? $result : (int)$result;
Вообще не нормально. Любые интерфейсы и делаются для того чтобы было понятно и адекватно. Можно просто внутри производить приведение типов