To solve this optimization problem, we first need to define the decision variables, the objective function, and the constraints.

Let's denote:
- $x$ as the number of packages of drills produced.
- $y$ as the number of packages of saws produced.

The objective is to maximize profit. Given that each package of drills yields a profit of $35 and each package of saws yields a profit of $100, the objective function can be written as:
\[ \text{Maximize:} \quad 35x + 100y \]

The constraints are based on the time availability of the machines:
- The milling machine constraint is given by \(20x + 30y \leq 800\), since it takes 20 minutes to produce a package of drills and 30 minutes for a package of saws, with a maximum of 800 minutes available.
- The CNG machine constraint is \(70x + 90y \leq 800\), reflecting the time requirements for producing drills (70 minutes) and saws (90 minutes), again with a limit of 800 minutes.

Additionally, we have non-negativity constraints since production cannot be negative:
\[ x \geq 0, y \geq 0 \]

Now, let's express this problem in Gurobi code using Python:

```python
from gurobipy import *

# Create a new model
m = Model("Tool_Production")

# Define the decision variables
x = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="Drills")
y = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="Saws")

# Set the objective function to maximize profit
m.setObjective(35*x + 100*y, GRB.MAXIMIZE)

# Add constraints for milling and CNG machines
m.addConstr(20*x + 30*y <= 800, name="Milling_Machine_Constraint")
m.addConstr(70*x + 90*y <= 800, name="CNG_Machine_Constraint")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Drills: {x.x}")
    print(f"Saws: {y.x}")
    print(f"Maximum Profit: ${m.objVal:.2f}")
else:
    print("No optimal solution found")
```