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

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

The objective is to maximize profit. Given that each package of hammers sells for a profit of $72 and each package of screwdrivers for $70, the total profit can be represented by the equation:
\[ \text{Profit} = 72x + 70y \]

There are constraints based on the availability of machines (lathe and CNG) and the time required to manufacture each type of tool. For the lathe, it takes 28 minutes per package of hammers and 23 minutes per package of screwdrivers, with a maximum of 720 minutes available:
\[ 28x + 23y \leq 720 \]

For the CNG machine, it takes 82 minutes per package of hammers and 76 minutes per package of screwdrivers, also with a maximum of 720 minutes available:
\[ 82x + 76y \leq 720 \]

Additionally, we have non-negativity constraints since the number of packages produced cannot be negative:
\[ x \geq 0 \]
\[ y \geq 0 \]

Now, let's translate these equations into Gurobi code in Python:

```python
from gurobipy import *

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

# Define the decision variables
x = m.addVar(vtype=GRB.CONTINUOUS, name="hammers")
y = m.addVar(vtype=GRB.CONTINUOUS, name="screwdrivers")

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

# Add constraints for machine availability
m.addConstr(28*x + 23*y <= 720, "lathe_limit")
m.addConstr(82*x + 76*y <= 720, "cng_limit")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: Produce {x.x:.2f} packages of hammers and {y.x:.2f} packages of screwdrivers.")
    print(f"Maximum profit: ${m.objVal:.2f}")
else:
    print("No optimal solution found.")

```