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

Let's denote:
- $x_1$ as the number of units of essential oil used in the mixture.
- $x_2$ as the number of units of fruit scent used in the mixture.

The objective is to minimize the total cost of the mixture, which can be represented by the function: 
\[ \text{Minimize} \quad 3.5x_1 + 2x_2 \]

Given the constraints:
- The mixture must contain at least 6 units of aromatic notes: $3x_1 + 10x_2 \geq 6$.
- The mixture must last at least 7 hours: $9x_1 + 4x_2 \geq 7$.
- The mixture can contain at most 8 units of aromatic notes: $3x_1 + 10x_2 \leq 8$.
- Non-negativity constraints: $x_1 \geq 0$, $x_2 \geq 0$, since we cannot use a negative amount of any ingredient.

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

```python
from gurobipy import *

# Create a model
m = Model("Perfume_Mixture")

# Define the decision variables
x1 = m.addVar(lb=0, name="essential_oil")
x2 = m.addVar(lb=0, name="fruit_scent")

# Set the objective function
m.setObjective(3.5*x1 + 2*x2, GRB.MINIMIZE)

# Add constraints
m.addConstr(3*x1 + 10*x2 >= 6, name="aromatic_notes_min")
m.addConstr(9*x1 + 4*x2 >= 7, name="duration_min")
m.addConstr(3*x1 + 10*x2 <= 8, name="aromatic_notes_max")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Essential Oil: {x1.x}")
    print(f"Fruit Scent: {x2.x}")
    print(f"Total Cost: {m.objVal}")
else:
    print("No optimal solution found")
```