Do you ignore alpha values of your respective textures ?
Also, as you are blending/mixing two values with an alpha factor, you can't ponderate both values with it, one of it would use (255. - alpha.a) instead for example (if alpha.a = 0, one texture is fully used and the other unused, right ?).
So it would be
DIFFUSE_ALPHA = vec4(cavern.r,cavern.g,cavern.b,alpha.a)+vec4(road.r,road.g,road.b,(255. - alpha.a));
But formula would still be wrong, for example you are your resulting vector v has v.r = cavern.r + road.r that is likely to go out of bound.
So you would do something like :
DIFFUSE_ALPHA = vec4(cavern.r*alpha.a/255. + road.r*(255. - alpha.a)/255., cavern.g*alpha.a/255. + road.g*(255. - alpha.a)/255., cavern.b*alpha.a/255. + road.b*(255. - alpha.a)/255., cavern.a*alpha.a/255. + road.a*(255. - alpha.a)/255.);
or... much simpler :
DIFFUSE_ALPHA = cavern.r*alpha.a/255. + road*(255. - alpha.a)/255.
Maybe you'd like to try something like this, with built-in linear interpolate function :
DIFFUSE_ALPHA = mix(cavern, road, alpha.a/255.);
DIFFUSE_ALPHA = mix(cavern, road, alpha.r/255.);
-> just draw black and white on your alpha texture.
Or even :
DIFFUSE_ALPHA = mix(cavern, road, alpha);
with proper alpha texture.
I hope it helped (I am not even using Godot yet :P), otherwise please provide result example from your favorite picture editor.