Yeah, the whole padding thing seem always a bit questionable :). I have actually no idea how much it effects the effectiveness of an RNN layer, particularly when some sequences in the batch are really short, i.e., have much padding. From my experience so far you have several options:

You use padded batches “as is” and hope the padding doesn’t cause any harm :).
You can use PackedSequence. In this case, you have to be a bit more careful how you use the return values from the GRU layer. See my post on this topic.

You can use the ‘BucketIterator’ from torchtext. This data loader sorts the sequences and creates batches with sequences of the same or at least similar length. For large datasets, most batches will have sequences of the same length; in all other batches the padding will be minimal.
You can write your own data loader that guarantees that all sequences have the same length. I did this for an autoencoder network (seq2seq) because of the word-by-word loop in the decoder. Here, some batches might not be full, but given a large dataset this is negligible.

In general, it depends what you want to do: sequence classification, sequence tagging, sequence-to-sequence (autoencoder, machine translation), …?
I always try (a) to go with batches simply for performance reasons and (b) to minimize the need for padding. For everything except machine translation I can currently avoid padding with my custom data loader.