In Swift the initial array would be allocated with (capacity: N) in order to minimize allocations during the processing loop as the appends expand the array.
So, with your new implementation you think your complexity is O(N), when in actuality on an array of significant size you've got quite a few additional reallocations and memory copies occurring during the process.
Almost all of the standard library array functions contain those kinds of optimizations, as well as several other additional compiler tricks that can occur when those functions are chained together. Especially when using .lazy. (The people who wrote the standard library implementations are pretty smart.)
All of which is why in most cases I think developers would be better off learning and using the built in functionality and chaining techniques as opposed to rolling their own implementations.
Understand your point, just don't think this particular example pays off.