This works without error
In[6]:= NMinimize[{f1[w] + f2[x] + f3[y] + f4[z], {w + x + y + z == 7000,
0 <= w <= 4000, 0 <= x <= 4000, 0 <= y <= 3000, 0 <= z <= 3000}}, {w, x, y, z}]
Out[6]= {793.412, {w -> 1829.54, x -> 1709.12, y -> 1791.87, z -> 1669.47}}
For this problem this happens to find a smaller minimum
In[7]:= NMinimize[{f1[w] + f2[x] + f3[y] + f4[z], {w + x + y + z == 7000,
0 <= w <= 4000, 0 <= x <= 4000, 0 <= y <= 3000, 0 <= z <= 3000}}, {w, x, y, z},
Method -> "RandomSearch"]
Out[7]= {583.291, {w -> 2153.49, x -> 0., y -> 2663.08, z -> 2183.44}}
And this finds an even smaller minimum.
In[8]:= NMinimize[{f1[w] + f2[x] + f3[y], {w + x + y == 7000,
0 <= w <= 4000, 0 <= x <= 4000, 0 <= y <= 3000}}, {w, x, y},
Method -> "RandomSearch", MaxIterations -> 10^4]
Out[8]= {384.535, {w -> 4000., x -> 0., y -> 3000.}}
I suspect almost any minimization method is going to have problems where some or all your functions have smoothly growing very large values adjacent to isolated points where the functions are much smaller. So if you have functions like that then I suspect that your idea of checking all the isolated points, in addition to using a general minimization method, might be the best approach.