Is it possible for a syscall to pack together different places in memory?
No, that isn't possible in general, because the page tables work at a page granularity.  If the length of every buffer is an exact multiple of the page table size, and every buffer starts at a page table boundary, you could do what you're proposing, but otherwise you can't.  Since buffers usually won't satisfy those conditions, it's not very useful to create such a syscall.

There are techniques for structuring software to avoid making copies.  However, this often requires that you restructure the code to support this.  See https://en.wikipedia.org/wiki/Zero-copy.