It could be two things. Filtering or sub-pixels. When you use any image or sprite, unless it is displayed at pefect native resolution (not scaled or rotated) then there is some filtering, typically bilinear (but it could be others). This is when several pixels from around the theoretical pixel are sampled to contribute to the physical pixel on the screen. So if you have two tiles in a single image, the sampling could be looking at two unrelated tiles (for example if grass and dirt are next to each other, they can bleed in).
The other issue is with sub-pixels, sort of related. Even if you disable filtering (which you can do in the import options) there will still be a mismatch between a sprite pixel and a screen pixel. Enabling GPU pixel snap will fix this (in the project settings) but only if you never scale or rotate the sprites. If you do scaling or rotation, then it is impossible for a sprite pixel to exactly match a screen pixel. Each screen pixel will actually be a combination of multiple sprite pixels, which can cause shimmering, weird border lines, and colors from one tiles bleeding into another.
I think the only way to solve both problems is to give a border (2 pixels at least, but 4 pixels works well) around each tile. So, for example, if you have a grass tile and a dirt tile, the grass can have a solid green 2 pixel border around it, and the dirt has a solid 2 pixel brown border. It takes a little more work to assemble the tile map, but it is possible in Godot. In this case, you can choose to enable or disable GPU pixel snap, I don't think it will matter, but GPU snap helps with jittering. But you should enable image filtering as you are rotating the sprites and they will flicker if it's disabled.