"loathed" is not a universal thing, reduce is great.
Having better abstractions is also great! But arr.reduce((a, b) => a + b) is hardly an onerous task, or an unreadable line of code, and it also avoids questions of "does it work with numbers, bigints, or both?"
I can read it, but I can't tell what it's doing until I get to the very end of the line. Oh, and oops, it throws an error now because arr was empty. That initialValue argument is easily forgotten.
I've had to write functions like these on multiple occasions, and I've often wished they were built-in.
Math.sum(...arr) has the problem that it doesn't work for large arrays, because engines still try to put spread arguments on the stack regardless what the function does with them.
I would prefer an iterator method arr.values().sum(), or possibly a generic reducer/collector protocol1 like arr.values().to(Number.sum)/arr.values().collect(Number.sum). This would equivalently work with BigInt.sum.
1: for a protocol, I would expect the "to" method to be implemented as to(target) { return (target[Symbol.fromIterator] ?? target.from)(this); }, it would e.g. also work with iter.to(Array) or iter.to(Set) etc.