I have no experience with MagicaVoxel or Voxel in general. But I've experience with importing 3D meshes into Godot.
If your external tool is lacking and you don't get the right scale/measures when importing then there's also an automatic way to adjust the import.
You can do this by import scripts. They can be assigned to the import and they'll be called right after a 3D-object has been imported into a scene file. So you can check all meshes (and materials) and alter them according to your needs.
About scaling: Generally, I wouldn't say that scaling does affect performance too much. But I didn't run benchmarks on that. But: You might mix up things here between scale and complexity. When a mesh contains more vertices/tris then this WILL naturally affect performance.
Example: A 2D mesh of 1x1 squares will contain 4 vertices whereas a 2D mesh of 3x3 squares will contain (at least) 9 vertices. A 3D mesh of 1x1 squares scaled by factor of 3 will still have 4 vertices though.
Using scaled meshes:
Personally, I prefer using meshes with scale 1 when there's no compelling reason to have otherwise. Blender i.e. has methods to scale down a mesh or to "apply scale".
I'll add here a simple script that I used to apply a scale of a mesh inside godot. So that the vertices are recalculated and the scale can be reset to 1.0. This isn't a custom import script but it shows one way to rescale a meshinstance:
#Small Tool to apply the scale to a MeshInstance
# this results in a mesh with scale 1,1,1 (and scaled vertex coordinates)
# How to use:
# #1: assign script to MeshInstance with scale != (1,1,1)
# #2: in the inspector check "Apply Scale Now"
# #3: this should result in no visible changes except that the scale is now 1,1,1
# !! Warning: Do a backup of the scene/mesh first, information may be lost
# !! Warning: overridden materials in MeshInstance may be lost
export(bool) var applyScaleNow = false setget _apply_scale_now
if mesh is ArrayMesh:
if (scale-Vector3(1,1,1)).length()>0.001: #scale not 1
var mdt = MeshDataTool.new()
var scount=mesh.get_surface_count() #save count because with keep deleting & adding
for s in range(0,scount):
# we will always get & remove the first surface and add it on the end
# therefore index "s" will be ignored
for i in range(mdt.get_vertex_count()):
var vertex = mdt.get_vertex(i)
var saveMaterial = mesh.surface_get_material(0)
print("Scale already 1,1,1")
#shape.points (PoolVector3Array) passed by value
print("For ArrayMesh only")
print("No mesh is assigned...")