What you’re seeing is basically due to floating point imprecision, combined with (as Olly says) non-welded vertices. This can occur even if you’re sure there are no imprecisions in your own measurements: Your blocks may be exactly 1m square, and you may have used grid snapping to position them exactly 1m apart, but Unity’s engine (and most other 3d engines) will be storing the object positions and vertex positions as floating point values.
Because they’re separate objects and not welded vertices, Unity has no idea that these two vertices are supposed to be in exactly the same spot, and the calculations used to compute the on-screen position may result in tiny differences in value.
Consider the vertex shown in yellow for object A and B:
[11545-rendering+gap+artefact.jpg|11545]
If this mesh was welded, Unity would calculate one position for the shared vert. But since they’re not welded, and two separate objects each have a vert in that position, Unity will perform two separate floating point calculations - one for object A and one for object B.
Most of these blocks appear to line up exactly, from most camera positions. But from the occasional unfortunate position, the exact value for A’s position plus its vertex at (0.5,0.5,-0.5) might be slightly different to object B’s position plus its vertex at (-0.5,0.5,-0.5) . The result is that Unity shows a tiny gap, within which you can see the shadowed side of cube A. If these were planes instead of cubes, you’d be able to see through the pixel-wide gap.
A workaround might be to make these blocks a tiny amount larger than your grid size, so they overlap slightly. For 1x1x1 bricks, a scale of (1.001, 1.001, 1.001) would be enough. This would mean as a side effect that you might be able to see the slight overlap when looking very closely, but from your screenshot, it might be acceptable for your purpose.