I did not do any timings, but maybe this is pointing into the right direction. I am applying a mask made out of a graphics:
img = Image@
Abs[Cos[\[Pi]^2 Outer[Plus, Range[-1, 1, 0.002]^2,
2 Range[-1, 1, 0.002]^2]]];
dims = ImageDimensions[img];
mask = Image[
Graphics[{White, Disk[{0, 0}, Min[dims]/2]}, Background -> Black,
PlotRangePadding -> None], ImageSize -> dims];
imgCrop = img mask