Newer GnuTLS versions provide a gnutls_aead_cipher_encryptv() function to directly pass in an io vector (struct iov). This is nice as you avoid allocating memory and copying data around, but there is no corresponding gnutls_aead_cipher_decryptv() function which would allow the same for decryption.
It might be enough for TLS to just have an encryption function but there are other protocols like SMB which require the same for decryption. The io vector passed in for file transfer is 8MB in total. It would safe a lot of allocating and copying memory around. However it is already a huge performance improvement to use GnuTLS for crypto, see https://hackmd.io/s/S1bJnG4IN