Yes indeed that is my experience as well, but your input got me inspired. I use most of my visualization code within Manipulate. So from all the information here a short kernel time and a short frontend time will result in a "smoother experience".
Image has by far the best frontend time, so is it possible to reduce the kernel time?
I noticed when explicitly giving Image the RGB and alpha values and forcing ColorSpace->"RGB" makes Image much faster. So the challenge was how to efficiently convert an arbitrary range of data values to RGB values and feeding that to Image. Also, I needed some specific options for the code to work in the larger scope.
My solution now is to pre-generate some lookup tables with predefined gradients. Next, I convert my data to integers with the same range as the length of the color lookup table. Finally, it is just selecting the correct color values from the lookup table.
With that, i end up with something faster than both the Graphics option or the Colorize@Image option and with the flexibility that I needed.

and this allows me to use ImageCompose.

And most important it runs very smoothly within manipulate with the size of images I typically work with.
(*some fixed settings*)
ncol = 1024;
colfuncs = {1 -> "Normal", 2 -> "Reverse", 3 -> "Symmetric",
4 -> "Reverse Symmetric"};
colfuncsR = Reverse /@ colfuncs;
colorNames = {"GrayTones", "Rainbow", "ThermometerColors",
"SunsetColors", "TemperatureMap", "LightTemperatureMap",
"GrayYellowTones", "BlueGreenYellow", "AvocadoColors",
"SouthwestColors"};
(*convert a RBBColor to {r,g,b,alpha}*)
ClearAll[Col2Num];
Col2Num[c_] := N@Join[List @@ c, {1}];
(*define the color function orders*)
ClearAll[ColSel]
ColSel[func_, cfunc_] :=
With[{fun = {# &, 1 - # &, Abs[(2 # - 1)] &,
Abs[Abs[(2*#) - 1] - 1] &}[[func]]}, ColorData[cfunc][fun[#]] &]
(*generate all the color lookup tables*)
ClearAll[ColorLookup2]
ColorLookup2[___] = Darker[Red];
With[{ran = Range[0, 1., 1./(ncol - 1)]}, Table[
ColorLookup2[j, i] = Col2Num[ColSel[j, i][#]] & /@ ran,
{j, 1, 4}, {i, colorNames}]];
(*color lookup function, presersing clipping and transparentcy. It \
converts integers to color values*)
(*returs the color function*)
ClearAll[LookUpTable3]
LookUpTable3[{lstyle_, color_}, {trans_, minclip_, maxclip_}, {pmin_,
pmax_}] := Module[{collist, fun, minc, maxc},
(*generate color lookup table with correct clipping colors for min \
and max,add opacity for Image function*)
collist = If[trans,
{{1., 1., 1., 0.}}~Join~(ColorLookup2[lstyle, color])~
Join~{{1., 1., 1., 0.}},
{Col2Num[minclip]}~Join~(ColorLookup2[lstyle, color])~
Join~{Col2Num[maxclip]}
];
(*define the color function fun*)
fun[x_?VectorQ] := collist[[x]];
fun[x_?MatrixQ] := collist[[#]] & /@ x;
fun
]
(*converts numbers to integers for color lookup*)
ClearAll[ColorRound2]
ColorRound2 = With[{n = ncol},
Compile[{{x, _Real, 0}, {pmin, _Real, 0}, {pmax, _Real, 0}},
If[pmin <= x <= pmax,
Round[(n - 1) ((x - pmin)/(pmax - pmin))] + 2,
If[x < pmin, 1, n + 2]],
RuntimeOptions -> "Speed", RuntimeAttributes -> {Listable}]
];
(*the "fast" image function with the needed options*)
Options[FastImage] = {
PlotRange -> Automatic,
TransparentClipping -> False,
ClippingStyle -> {Black, White},
ImageOpacity -> 1,
ColorFunction -> "Rainbow",
ColorFunctionOrder -> "Normal"
};
FastImage[data_, OptionsPattern[]] :=
Block[{cfo, cf, cl1, cl2, tcl, plr, op, imAll},
cfo = OptionValue[ColorFunctionOrder] /. colfuncsR;
cf = OptionValue[ColorFunction];
{cl1, cl2} = OptionValue[ClippingStyle];
tcl = OptionValue[TransparentClipping];
plr = OptionValue[PlotRange] /. Automatic -> MinMax[data];
op = OptionValue[ImageOpacity];
imAll =
LookUpTable3[{cfo, cf}, {tcl, cl1, cl2}, plr][
ColorRound2[data, plr[[1]], plr[[2]]]];
SetAlphaChannel[
Image[imAll[[All, All, ;; -2]], ColorSpace -> "RGB",
ImageSize -> 300], Image[op imAll[[All, All, {-1}]]]]
]
(*make the data and manipulate*)
im = 750;
data = ToPackedArray@N@Table[i, {i, 1, im}, {j, 1, im}];
{mi, ma} = MinMax[data];
ra = ma - mi;
Manipulate[
FastImage[data,
PlotRange -> {min, max},
TransparentClipping -> trans,
ClippingStyle -> {minCl, maxCl},
ImageOpacity -> op,
ColorFunction -> col,
ColorFunctionOrder -> cfun]
,
{{min, mi}, mi, Dynamic[max - 0.01 ra], ra/100},
{{max, ma}, Dynamic[min + 0.01 ra], ma, ra/100},
{col, colorNames},
{{trans, False}, {True, False}},
{{op, 1}, 0, 1},
{minCl, Red},
{maxCl, Blue},
{cfun, colfuncs}]
