I think that you are on a good track with the "integrate" tool. However, you'll need to define a large tolerance in order to fill the gaps, which explains why your boundaries are affected. Here are a few more steps to take the most of your data:
1) integrate (on a copy of your data)
2) union the integrated result and the dissolved data with roads.
3) now, if you look at your attribute table, you will see the attribute values of the localities. Create a new field in your attribute table and fill it with the localities of the non-integrated layer (if existing) or the integrated layer (if there is no value in the first field).
4) dissolve based on the new field
At this stage, internal boundaries should be OK, so let's try to fix the outer boundaries (if needed).
5) dissolve the entire layer (no field, you just want a single polygon)
6) make a negative buffer of the result (approximately the tolerance of your integrate)
7) From the results of step 3, select the polygons that do not touch your buffer AND have a null value in the "locality" field from the first "nonintegrated" layer.
8) Delete those polygons
9) Dissolve based on the new field from step 3.