To solve the optimization problem described, we first need to define the decision variables and the objective function. Let's denote:
- \(x\) as the number of milk chocolate pieces,
- \(y\) as the number of dark chocolate pieces.

The objective is to minimize the total cost, which can be represented by the equation: 
\[ \text{Minimize} \quad 0.50x + 0.75y \]

Given the constraints:
1. The mixture must contain at least 120 units of cacao.
2. The mixture must contain at least 80 units of sugar.

From the problem description, we know that each milk chocolate piece contains 3 units of cacao and 2 units of sugar, and each dark chocolate piece contains 4 units of cacao and 1 unit of sugar. Thus, the constraints can be written as:
\[ 3x + 4y \geq 120 \] (for cacao)
\[ 2x + y \geq 80 \] (for sugar)

Also, \(x \geq 0\) and \(y \geq 0\), since the number of chocolate pieces cannot be negative.

Now, let's write the Gurobi code to solve this linear programming problem:

```python
from gurobipy import *

# Create a new model
model = Model("Chocolate_Mixture")

# Define variables
x = model.addVar(lb=0, vtype=GRB.CONTINUOUS, name="milk_chocolate")
y = model.addVar(lb=0, vtype=GRB.CONTINUOUS, name="dark_chocolate")

# Set the objective function
model.setObjective(0.50*x + 0.75*y, GRB.MINIMIZE)

# Add constraints
model.addConstr(3*x + 4*y >= 120, "cacao_constraint")
model.addConstr(2*x + y >= 80, "sugar_constraint")

# Optimize model
model.optimize()

# Print solution
if model.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Milk Chocolate Pieces: {x.x}")
    print(f"Dark Chocolate Pieces: {y.x}")
    print(f"Total Cost: ${model.objVal:.2f}")
else:
    print("No optimal solution found")
```