Frequency Domain Filtering with big kernel size
You dont have sigma specified for the gaussian filter. I typically use something like

fspecial('gaussian',6*sigma,sigma);


as the gaussian kernel is roughly 6 x sigma wide. (see graph here but note they plot against variance https://en.wikipedia.org/wiki/Gaussian_function)

Because of that, your padding should be 3 x sigma. But padding with zeros creates an edge in the image that might not have been there. You may get better results by replicating the outer pixels instead of padding with zeros:

padarray(I,[3*sigma,3*sigma],'symmetric');


Also you might want to do an ifftshift before doing the fft2 of the filter (note the i)

You could up this to 8 x sigma (and 4 x sigma) if you really want most of the kernel. The gaussian kernel has infinite support so there will always be some circular convolution effect - you can't pad to infinity - but with 3 or 4 sigma padding it will be small.

btw MATLAB recommends using imgaussfilt http://au.mathworks.com/help/images/ref/imgaussfilt.html