To solve this optimization problem using Gurobi, we first need to define the decision variables and the objective function. Then, we will formulate the constraints based on the given conditions.

The decision variables are:
- `oreos`: The amount of oreos.
- `kiwis`: The amount of kiwis.
- `slices_of_pizza`: The amount of slices of pizza.

The objective function to minimize is: `8 * oreos + 8 * kiwis + 7 * slices_of_pizza`.

Now, let's translate the constraints into mathematical expressions:
1. Fiber from oreos plus slices of pizza should be at least 61 grams.
2. Fiber from oreos plus kiwis should be at least 90 grams.
3. Fiber from all sources (oreos, kiwis, and slices of pizza) should be at least 74 grams.
4. The sourness index from kiwis and slices of pizza should be at least 59.
5. The total sourness index from all sources should be at least 59.
6. `-8 * kiwis + 7 * slices_of_pizza >= 0`.
7. `3 * oreos - 4 * kiwis >= 0`.
8. `-4 * oreos + 5 * slices_of_pizza >= 0`.
9. Fiber from kiwis and slices of pizza should not exceed 170 grams.
10. Fiber from oreos and kiwis should not exceed 358 grams.
11. The sourness index from oreos plus slices of pizza should not exceed 115.

Given the complexity and the fact that all variables are continuous (do not have to be whole), we can directly implement this in Gurobi without needing integer constraints.

Here is how you could write this optimization problem in Python using Gurobi:

```python
from gurobipy import *

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

# Decision variables
oreos = m.addVar(lb=0, name="oreos", vtype=GRB.CONTINUOUS)
kiwis = m.addVar(lb=0, name="kiwis", vtype=GRB.CONTINUOUS)
slices_of_pizza = m.addVar(lb=0, name="slices_of_pizza", vtype=GRB.CONTINUOUS)

# Objective function
m.setObjective(8 * oreos + 8 * kiwis + 7 * slices_of_pizza, GRB.MINIMIZE)

# Constraints
m.addConstr(1 * oreos + 12 * slices_of_pizza >= 61, name="fiber_from_oreos_and_pizza")
m.addConstr(1 * oreos + 23 * kiwis >= 90, name="fiber_from_oreos_and_kiwis")
m.addConstr(1 * oreos + 23 * kiwis + 12 * slices_of_pizza >= 74, name="total_fiber_min")
m.addConstr(7 * kiwis + 6 * slices_of_pizza >= 59, name="sourness_from_kiwis_and_pizza")
m.addConstr(22 * oreos + 7 * kiwis + 6 * slices_of_pizza >= 59, name="total_sourness_min")
m.addConstr(-8 * kiwis + 7 * slices_of_pizza >= 0, name="kiwi_pizza_constraint")
m.addConstr(3 * oreos - 4 * kiwis >= 0, name="oreo_kiwi_constraint")
m.addConstr(-4 * oreos + 5 * slices_of_pizza >= 0, name="oreo_pizza_constraint")
m.addConstr(23 * kiwis + 12 * slices_of_pizza <= 170, name="fiber_from_kiwis_and_pizza_max")
m.addConstr(1 * oreos + 23 * kiwis <= 358, name="fiber_from_oreos_and_kiwis_max")
m.addConstr(22 * oreos + 6 * slices_of_pizza <= 115, name="sourness_from_oreos_and_pizza_max")

# Solve the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Oreos: {oreos.x}")
    print(f"Kiwis: {kiwis.x}")
    print(f"Slices of Pizza: {slices_of_pizza.x}")
else:
    print("No optimal solution found.")

```
```python
```