La ultima condición lo rompe todo y te sobra limit 1, esto último no hace daño,
 
Tienes  
WHERE (a y b) OR (a y c y d) AND e 
Eso tiene en cuenta los que cumplen ayb o los que cumplen aycyd y e, estoy suponiendo que e lo deben cumplir todos.    
Código SQL:
Ver originalSELECT MIN(precio) AS precio 
FROM precios 
WHERE ((id_curso=id 
              AND tipoconfiguracion='1' 
              AND visible='1') 
OR ( id_articulo=id AND tipoconfiguracion='0' 
        AND fechaini>'hoy' 
        AND visible='1'))
  
WHERE 
((a y b
 y e) OR (a y c y d 
y e)
)  
Uy de donde sale 
id_articulo 
Si en la tabla precios hay varios precios para un mismo id (y id_articulo era un error) luego funcionara o esta otra, la primera parece más "compacta"....    
Código SQL:
Ver originalSELECT MIN(preciomin) AS precio_minimo
FROM 
(SELECT MIN(precio) AS preciomin 
FROM precios 
WHERE id_curso=id AND tipoconfiguracion=1 AND visible=1
UNION ALL
SELECT MIN(precio) AS preciomin
FROM precios 
WHERE id_curso=id AND tipoconfiguracion=0 AND fechaini>'hoy' AND visible=1)
  
$hoy tiene el formato YYYY-mm-dd, no? y los apostrofes alrededor de la fecha otro error? ...